Sembra che si stia interpretando erroneamente il testo.
ora posso essere d'accordo con l'ultimo, ma in JavaBeans del mio occhio in un elenco che rende molto più senso di mappe nidificate
Il testo non menziona mai cartine nidificati in alternativa (yiack)
... dovrebbe chiamare i costruttori, non impostare * metodi, e l'oggetto deve essere immutabile
Questa è una buona pratica, particolarmente utile quando si tratta di thread.
Ma non possiamo dire che utilizzando incastonatori è baaad sia, specialmente quando un singolo filo utilizza l'oggetto. Questo è perfettamente al sicuro.
Non voglio creare un nuovo oggetto ogni volta che vengono fornite nuove informazioni, voglio aggiungerlo a uno esistente.
va bene, fino a quando è possibile controllare l'oggetto non v'è alcun problema con questo, qualche altro può trovare più facile creare solo un nuovo oggetto.
L'utilizzo di JavaBeans per l'archiviazione dei dati è una pratica scorretta e deve essere evitato oppure è perfettamente sicuro?
No, non è una cattiva pratica. Non è perfettamente al sicuro anche. Dipende dalla situazione.
Il problema con oggetti mutabili (non con JavaBeans di per sé) utilizza thread diversi per accedervi.
È necessario sincronizzare l'accesso per evitare che un thread modifichi l'oggetto mentre altri lo accedono.
Gli oggetti immutabili non hanno questo problema, perché ... beh non possono essere modificati e, quindi, non è necessario sincronizzare nulla.
Per assicurarsi che un oggetto sia immutabile, è necessario dichiarare i propri attributi come finali.
class MyBean {
private final int i;
}
Se si desidera assegnare un valore ragionevole MyBean.i
è necessario specificare nel costruttore:
public MyBean(int i) {
this.i = i;
}
Poiché la variabile è definitiva, non è possibile utilizzare un setter. Puoi solo fornire un getter.
Questo è perfettamente thread-safe e la cosa migliore è, non c'è bisogno di sincronizzare l'accesso, perché se due thread cercano di ottenere il valore di i
entrambi vedranno sempre il valore che è stato assegnato a esemplificazione, si non devi sincronizzare nulla.
Non è una cattiva pratica o una buona pratica.Dobbiamo lavorare con un singolo thread, anche in ambienti multithread come i servlet.
Se in futuro si ha a che fare con applicazioni multi thread, si può considerare l'utilizzo di un JavaBean immutabile;)
BTW, l'alternativa per creare fagioli immutabili, e continuano ad offrire un po 'di setter sta usando Builders
come :
Employee e = new EmployeeBuilder()
.setName("Oscar")
.setLastName("Reyes")
.setAge(0x1F)
.setEmployeeId("123forme")
.build();
che sembra molto simile alla normale setXyz utilizzato in grani regolari con il vantaggio di utilizzare i dati immutabili.
Se è necessario modificare un valore, è possibile utilizzare un metodo di classe:
Employee e = Employee.withName(e, "Mr. Oscar");
che prende l'oggetto esistente, e copiare tutti i valori, e impostare un nuovo ....
public static EmployeeWithName(Employee e , String newName){
return new Employee(newName, e.lastName, e.age, e.employeeId);
}
Ma ancora, in un modello a filo singolo è perfettamente sicuro utilizzare getter/setter.
PS Vi incoraggio vivamente a comprare questo libro: Effective Java. Non te ne pentirai mai e avrai informazioni per giudicare articoli migliori come uno citato.
JavaBeans non rappresenta tanto un modello come un intero linguaggio anti-pattern. –
puoi utilizzare un builder per ottenere i vantaggi dell'immutabilità ed evitare il costruttore super lungo. –
Considerare l'apprendimento del Pattern Builder. http://en.wikipedia.org/wiki/Builder_pattern. – CoolBeans