Quando si crea una libreria, esiste un modo per rendere certe classi interamente interne alla libreria e non esposte all'utente della libreria? [duplicare]

3

Supponi di progettare una libreria Java che altre persone possano utilizzare. Si compila la libreria in un JAR che è possibile importare nei propri progetti e utilizzare.

Inutile dire che si intende utilizzare la libreria in determinati modi e attraverso determinate interfacce. Ad esempio, potresti creare diverse classi di Facade per controllare la libreria e nella documentazione indicare come deve essere usata la libreria, quale sia la classe e il metodo usati, ecc.

Ma c'è un modo per nascondere completamente una certa classe all'utente? In ogni libreria ci sono alcune classi (suppongo solitamente la maggior parte delle classi), che sono usate internamente dalla libreria e non dovrebbero essere usate direttamente dal codice usando la libreria.

C'è un modo per me di affermare "questa classe è per uso interno di questa libreria all'interno di questo JAR o all'interno di questo pacchetto, non può essere usata al di fuori dei confini di questa libreria"? È tecnicamente possibile? O dovrei semplicemente dichiarare nei documenti che certe librerie non dovrebbero essere usate dall'utente, e il gioco è fatto?

    
posta Aviv Cohn 22.09.2014 - 23:41
fonte

1 risposta

7

Usa package-private , che è ciò che ottieni quando non specifichi alcun modificatore di accesso. Limita una classe o un metodo solo per essere visibile al pacchetto in cui si trova.

package animals;

public class Animal { ... };

public class Giraffe extends Animal {
    void run() { ... }
    public void jump() { ... }
}

class Platypus extends Animal { ... }

Qualsiasi codice che imports del pacchetto animals sarà in grado di visualizzare la classe Animal e la classe Giraffe , ma non la classe Platypus . Inoltre, quel codice sarà in grado di chiamare il metodo Giraffe.jump() , ma non il metodo Giraffe.run() . Tuttavia, dentro il pacchetto, entrambi i metodi di Giraffe e la classe Platypus sono visibili.

Tieni presente che questo non funziona per i pacchetti annidati , quindi non puoi avere una classe privata del pacchetto nel pacchetto A essere visibile alle classi nel pacchetto A.B . Questo perché i pacchetti nidificati non sono realmente nidificati, sono trattati da java come due pacchetti distinti e non hanno alcuna relazione speciale tra loro. I pacchetti A e A.B non interagiscono diversamente da qualsiasi altro due pacchetti.

    
risposta data 23.09.2014 - 00:16
fonte

Leggi altre domande sui tag