Perché non esiste un modificatore di accesso "solo sottoclassi" in Java?

15

In Java, ci sono quattro modificatori di accesso disponibili per i metodi:

public - qualsiasi classe può utilizzare questo metodo.

protected - le classi nello stesso pacchetto e le sottoclassi in qualsiasi pacchetto possono utilizzare questo metodo.

private - solo questa classe può utilizzare questo metodo.

no modifier ("pacchetto privato") - solo le classi nello stesso pacchetto possono utilizzare questo metodo.

Quello che succede spesso è che voglio avere metodi utili in una superclasse, che tutte le sottoclassi possono usare. Ma non avrebbe senso che altre classi accedessero a questo metodo e, in un certo senso, rompesse l'incapsulamento.

Quindi devo dichiarare questi metodi utili nella superclasse public o protected , che li espone a tutte le altre classi almeno nel pacchetto. Anche se sono pensati solo per essere usati dalle sottoclassi.

C'è una ragione per cui non esiste un modificatore di accesso subclasses-only in Java? Mi sembra molto strano. Mi manca qualcosa?

Inoltre, un modificatore di accesso subclasses-only sarebbe utile anche quando vuoi esporre le variabili solo a sottoclassi. Che a me succede molto.

    
posta Aviv Cohn 10.05.2014 - 02:40
fonte

4 risposte

9

Poiché puoi emulare il modificatore sottoclasse utilizzando il modificatore protetto e facendo rispettare che solo la classe genitore e le sue sottoclassi si trovano nello stesso pacchetto.

È davvero una buona pratica, perché i pacchetti non solo aiutano a organizzare grandi progetti in termini di coesione, ma mostrano anche che le classi nello stesso pacchetto potrebbero avere un certo livello di accoppiamento.

    
risposta data 10.05.2014 - 03:35
fonte
12

Java aveva originariamente un tale modificatore. È stato scritto private protected ma rimosso in Java 1.0.

Suppongo che sia stato un giudizio che la complessità extra non valeva il costo.

Ogni funzione linguistica ha un costo: nell'insegnarlo ai nuovi programmatori; nella documentazione; nella sua implementazione nei compilatori, JVM e strumenti di sviluppo; nel ragionamento sulla correttezza del programma; nel limitare l'evoluzione del linguaggio futuro; e altro ancora. Le funzionalità linguistiche interagiscono tra loro, potenzialmente con interazioni N 2 .

Quale percentuale dei programmatori Java ha letto le specifiche del linguaggio Java e le specifiche VM? Scommetto che è una piccola percentuale, che sostiene un linguaggio ancora più semplice nell'interesse della comprensibilità e dei prodotti ingegneristici da cui possiamo dipendere

Il vantaggio della funzione private protected era ridotto poiché il pacchetto è l'unità principale di modularità.

    
risposta data 10.05.2014 - 06:26
fonte
4

Il controllo degli accessi può essere pensato come il risultato di una copertura con uno sviluppatore immaginario che sta lavorando con la tua classe sui metodi e le proprietà delle classi ...

YOU: Say you want to do x, you call the method doX.. DEV: Tell me more..what are the arguments?

Questo è pubblico ...

YOU: Inside doX I call ... DEV: Whoa, too much information, I don't care about that. I just want to know how to use it. Tell me something else.

Questo è privato ...

YOU: When subclassing, I have doX and doY call doIt which does.. DEV: Yeah, I gonna subclass, tell me more...

Questo è protetto ...

YOU: I'm leaving on on vacation in an hour, I'll be gone for the next 6 months. The Boss says this puppy is yours! Bye. DEV: Wait don't go yet, tell me everything...

Questo è il pacchetto.

YOU: The method doItWhen is only called by this class and it hasn't changed in ten years. It... DEV: Whoa, we're down to 50 minutes. Next property, and talk faster.

Questo è protetto privato ...

    
risposta data 10.05.2014 - 05:32
fonte
3

Questo esiste già. È protetto.

Hai il controllo su quali classi esistono all'interno del pacchetto. Se non ci sono altre classi nel pacchetto e una determinata variabile o metodo è protetto, è "solo sottoclassi".

Detto questo, ancora una volta, hai il controllo su quali classi esistono all'interno del pacchetto. Puoi scegliere di non utilizzare i metodi o le variabili protetti.

    
risposta data 10.05.2014 - 03:25
fonte

Leggi altre domande sui tag