2014-12-18 13 views
6

Ho una domanda su un modo subdolo per ottenere l'accesso ai membri di accesso ai pacchetti che mi sono venuti in mente. Nello specifico, voglio estendere una classe, chiamiamola com.acme.Foo, per aggiungere alcune funzionalità. Questa è pura aggiunta: tutti i metodi attuali di Foo sarebbero supportati solo delegando al metodo della superclasse. Tuttavia, non esiste un costruttore accessibile di Foo, quindi non posso estendere la classe e la mia implementazione non supererà il test "isA" per essere un Foo. Non esiste un'interfaccia che esprima Foo -ness che posso utilizzare al posto dell'ereditarietà.Ottenere l'accesso ai membri di accesso al pacchetto creando lo stesso nome di pacchetto

Questo è dove il pensiero subdolo mi venne in mente: Foo ha un costruttore pacchetto di accesso, quindi perché non solo creare un pacchetto com.acme nella mia cartella di origine e creare una classe InheritableFoo in quel pacchetto:

package com.acme; 

public class InheritableFoo extends Foo { 
    public InheritableFoo() { 
     super(); 
    } 
} 

Ora posso implementare la mia estensione su Foo estendendo InheritableFoo, poiché questo ha un costruttore accessibile.

Questo sembra tutto sbagliato, e in qualche modo immorale: non sto rispettando la decisione presa dal programmatore originale quando lui o lei ha deciso di non esporre un costruttore per . Ma potrebbe essere il caso che hanno semplicemente adottato l'approccio "nega tutto fino a che non c'è un motivo". In ogni caso, c'è qualcosa di fondamentalmente sbagliato in questa idea? Avrò problemi in futuro se seguirò questa strada e, in tal caso, perché?

risposta

1

Hai ragione riguardo al fatto che puoi "intrufolarti" in una tua classe in un altro pacchetto e ottenere l'accesso agli elementi del pacchetto limitato.

Questo tuttavia solo fino a quando l'autore di com.acme.foo distribuisce il suo codice come origine o un pacchetto non sealed. Se l'autore di questo pacchetto lo distribuisce come un barattolo sigillato (cosa abbastanza comune, credo), il tuo approccio non funzionerà più.

Da Sealing Packages within a JAR File

pacchetti all'interno dei file JAR può essere facoltativamente sigillata, il che significa che tutte le classi definite nel pacchetto devono essere archiviati nello stesso file JAR .

Problemi correlati