Blocking a doppio controllo, Netbeans mi confonde?
-
29-10-2019 - |
Domanda
Ho un problema riguardo al blocco a doppio controllo. Considera questo esempio:
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance ;
}
}
Come ho capito, il codice sopra è il modo corretto per fare una classe singleton.
Tuttavia, Netbeans vuole che rimuova l'istruzione esterna se, quindi sembrerebbe così:
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
return instance ;
}
}
L'unica differenza tra questi due frammenti è che nel secondo esempio, il codice entrerà sempre nel blocco sincronizzato e nel primo non lo farà. Perché dovrei ascoltare NetBeans e rimuovere l'istruzione If esterna? Dovrebbe essere meglio evitare il blocco.
Soluzione
Il sistema di suggerimenti automatici di NetBeans ovviamente non è consapevole del fatto che è possibile eseguire correttamente il blocco a doppio controllo volatile
, come hai fatto, quindi suggerisce invece il blocco completo. Meglio prevenire che curare. Ma hai ragione in questo caso, non Netbeans.
Altri suggerimenti
Il più delle volte, il singleton verrà utilizzato e non costa molto da creare, quindi rendilo semplice:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
...
}
Se vuoi davvero un'istanza pigra, usa una classe interna statica:
public class Singleton {
public static Singleton getInstance() {
return Holder.INSTANCE;
}
...
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
}
Non ascoltare Netbeans in questa situazione. Il tuo primo campione di codice è corretto.