Ho trovato un post in SO discutendo la modifica del codice richiesta per evitare di scrivere su un campo statico da un metodo di istanza, ma perché non è una buona pratica farlo? Perché i progettisti Java lo hanno consentito? In altre parole, perché il compilatore non genera un errore quando qualcuno tenta di farlo?Perché non è opportuno scrivere in campo statico dal metodo di istanza in Java?
risposta
Nelle parole della documentazione 'findbugz':
Questo metodo di istanza scrive ad un campo statico. Questo è difficile da correggere se vengono manipolate più istanze e, in generale, le cattive pratiche.
Ciò significa che non è sempre sbagliato, semplicemente che è qualcosa che è spesso fonte di errori. Gli oggetti di istanza che manipolano campi statici possono essere utili, ad esempio, per l'inizializzazione pigra di oggetti condivisi, quindi non sempre è sbagliato, ma può essere difficile farlo correttamente (in particolare se possono essere eseguiti più thread contemporaneamente).
In aggiunta a quanto sopra, da un punto di documentazione di vista è facile per qualcuno di assumere si tratta di un campo di istanza, se si utilizza il modulo:
someField = null
o
myObj.someField = null
utilizzando il modulo di
myClass.someField = null
rende più chiara e previene l'avvertimento findbugz (a quanto pare, non ho ancora testato). Nota, ciò non impedirà i problemi di multi-threading descritti.
Può essere utile, ad esempio, se hai un'applicazione che gestisce le formiche e devi essere in grado di accedere al numero totale di formiche create dalla classe ant. Questo può essere fatto scrivendo su un metodo statico che tiene traccia del numero totale di formiche ogni volta che si crea una nuova formica sul metodo statico addAnt();
- 1. Chiamata ambigua dal contesto statico in Java
- 2. Scrivi nel campo statico: in questo caso FindBugs è errato?
- 3. Inizializzazione del campo statico Java
- 4. C# Metodo statico contro istanza oggetto
- 5. Campo statico di DbContext in Global.asax rispetto al campo di istanza di DbContext nella classe controller?
- 6. Impossibile accedere al metodo non statico in contesto statico?
- 7. Perché ServerSocket.setSocketFactory è statico?
- 8. call finish() dal metodo statico
- 9. Perché JavaMail Transport.send() è un metodo statico?
- 10. Perché è possibile sovrascrivere le variabili di istanza in PHP ma non in Java?
- 11. costruttore Perché enum non può accedere campo statico
- 12. Perché un lambda senza cattura è cambiato da statico in C# 5 a un metodo di istanza in C# 6?
- 13. Metodo statico e metodo non statico
- 14. Perché posso chiamare Form.Close() se non è un metodo statico
- 15. Blocco statico in Java non eseguito
- 16. Java 8 riferimento ad un metodo statico vs. metodo di istanza
- 17. Return Lambda dal metodo in Java 8?
- 18. Perché il metodo Static nasconde il mio metodo di istanza?
- 19. Metodo di classe in Ruby (equivalente statico in JAVA)
- 20. Perché è consentito avere un metodo principale finale in java?
- 21. Creare un'istanza di classe dal metodo statico
- 22. Perché toString() non può essere un metodo statico?
- 23. Perché non è necessario creare oggetti per il metodo statico?
- 24. Metodi di supporto in C#: statico o non statico?
- 25. Perché il campo `statico privato 'non è consentito nell'interfaccia Java 8?
- 26. Metodo di riferimento. Non è possibile fare un riferimento statico per il metodo non statico
- 27. Esempio di un metodo di istanza? (Java)
- 28. Una classe Model (in MVC) dovrebbe utilizzare un metodo statico o un metodo di istanza?
- 29. Come aggiornare i controlli dal metodo statico?
- 30. Perché non dovremmo usare protetto statico in Java
in che modo l'esecuzione di più thread in esecuzione simultanea in questo codice lo rende problematico? La mia domanda era di ottenere una risposta a questo in realtà. Abbiamo la possibilità di creare più istanze del campo? – Inquisitive
C'è ancora un solo campo, ma se due di essi cercano entrambi di scrivere all'incirca nello stesso tempo, allora si può finire con la creazione di due oggetti e il cambio del campo, mentre probabilmente si desidera che esista solo una copia dell'oggetto . Ciò potrebbe causare seri problemi in alcuni casi, poiché diverse istanze dell'oggetto proprietario potrebbero utilizzare diversi oggetti condivisi. Dovresti inserire un blocco sincronizzato (this.getClass()) attorno a qualsiasi codice che potrebbe modificare il campo statico per assicurarti che funzioni. – Jules