Ho una classe come questa
public final class Outer {
static final class Inner {
/* Used in the package. */
void f() {...}
/* Used in Outer. */
WHATEVER void g() {...}
/* Used in Inner only. */
private void h() {...}
}
}
In Java, ogni membro definito nello stesso file può accedere a tutti gli altri membri (*), quindi g
potrebbe essere private
. L'alternativa è la visibilità predefinita.
L'ovvio vantaggio di private
è che è la visibilità minima possibile. Usandolo puoi essere certo che non ci sono utenti di g
al di fuori del file.
Ci sono anche degli svantaggi:
Poiché tale accesso è consentito da Java ma non dalla JVM, viene creato un metodo bridge, che viene quindi visualizzato in stacktraces e nel debugger. Inoltre, rallentano il programma, ma questo è trascurabile in quanto di solito si inline comunque.
Ciò che mi turba di più è che con g
è private
, non riesco a vedere se è destinato ad essere usato al di fuori di Inner
o se è "veramente privato" (come h
).
Le mie domande sono
- qual è la procedura migliore?
- c'è un'annotazione per un caso del genere (e viene riconosciuto da uno strumento)?
- come si comportano le altre lingue?
(*) Come affermato nella risposta di Timothy Truckle, questo è vero solo supponendo che non impacchettiate altre classi non pubbliche nello stesso file (cosa che praticamente nessuno fa da quando le classi nidificate sono state introdotte in Java 1.1).