Ci sono delle complicazioni o degli effetti collaterali per cambiare il modificatore di accesso / visibilità finale del campo da privato a protetto?

4

Ho un private final field in una classe e poi voglio indirizzare quel campo in una sottoclasse. Voglio cambiare il modificatore di accesso / visibilità da private a protected , quindi non devo chiamare il metodo getField() dalla sottoclasse e posso invece indirizzare direttamente quel campo (che è più chiaro e coerente). Ci saranno effetti collaterali o complicazioni se cambio private in protected per un campo final ?

AGGIORNAMENTO: dal punto di vista logico, è ovvio che il discendente dovrebbe essere in grado di accedere direttamente a tutti i campi predecessori, giusto? Ma ci sono alcuni vincoli imposti sui campi private final da JVM, come garanzia di inizializzazione del 100% dopo la fase di costruzione (utile per la concorrenza) e così via. Quindi mi piacerebbe sapere, cambiando da private a protected , questo o altri vincoli non saranno compromessi?

    
posta dhblah 03.12.2012 - 12:41
fonte

2 risposte

6

Penso che tu ti stia riferendo al "blocco dei campi finali" sull'istanza di un oggetto riuscito:

When a constructor terminates normally, the thread performs freeze actions on all final fields defined in that class.

come indicato in link

Credo che questo sia un argomento confuso, Alex Miller (ex collega di Terracotta), ha scritto su di esso qui: link

Comunque, suppongo che quello che sto cercando di dire è che il freeze si verifica in tutti i campi finali, non solo quelli finali privati ... Almeno questa è la mia comprensione di JMM. E di questo, hai codificato questo e non è stato dimostrato sbagliato ... fino ad ora! ;)

    
risposta data 03.12.2012 - 15:22
fonte
4

In base alla sezione 17.5 del JLS , i campi finali hanno la stessa semantica di Java Memory Model indipendentemente dall'accesso. Infatti, non ci sono campi privati negli esempi di codice di quella sezione. Hanno tutti accesso predefinito.

Tieni a mente le regole stabilite nel JLS: tutte le scommesse sono disattivate se permetti a un altro thread di vedere un riferimento al tuo oggetto prima che tutti i costruttori siano completati.

Inoltre, ci sono due trucchi per chiamare metodi sovrascrivibili dal costruttore della superclasse: il metodo sovrascritto nella sottoclasse vedrà i valori predefiniti per i campi (anche quelli finali) che non sono stati ancora scritti, e potrebbero anche pubblicare un riferimento all'istanza parzialmente costruita. Questi avvertimenti devono essere documentati sia sul costruttore che sui metodi che il costruttore potrebbe richiamare. O, meglio ancora, non chiamare i metodi overridable dal costruttore in primo luogo.

    
risposta data 03.12.2012 - 16:29
fonte

Leggi altre domande sui tag