[java] Classe immutabile?


Answers

Oltre alle risposte già fornite, consiglierei di leggere sull'immutabilità in Java efficace, 2 ° Ed., Poiché ci sono alcuni dettagli che sono facili da perdere (ad esempio copie difensive). Inoltre, efficace Java 2nd Ed. è una lettura obbligata per ogni sviluppatore Java.

Question

Come si può rendere immutabile una classe Java, qual è il bisogno di immutabilità e c'è qualche vantaggio nell'usarlo?




Un altro modo per creare oggetti immutabili è utilizzare la libreria Immutables.org :

Supponendo che siano state aggiunte le dipendenze richieste, creare una classe astratta con metodi di accesso astratti. Puoi fare lo stesso annotando con interfacce o persino annotazioni (@interface):

package info.sample;

import java.util.List;
import java.util.Set;
import org.immutables.value.Value;

@Value.Immutable
public abstract class FoobarValue {
  public abstract int foo();
  public abstract String bar();
  public abstract List<Integer> buz();
  public abstract Set<Long> crux();
}

È ora possibile generare e quindi utilizzare l'implementazione immutabile generata:

package info.sample;

import java.util.List;

public class FoobarValueMain {
  public static void main(String... args) {
    FoobarValue value = ImmutableFoobarValue.builder()
        .foo(2)
        .bar("Bar")
        .addBuz(1, 3, 4)
        .build(); // FoobarValue{foo=2, bar=Bar, buz=[1, 3, 4], crux={}}

    int foo = value.foo(); // 2

    List<Integer> buz = value.buz(); // ImmutableList.of(1, 3, 4)
  }
}



Rendi immutabile una classe come questa:

public final class Immutable
{
    private final String name;

    public Immutable(String name) 
    {
        this.name = name;
    }

    public String getName() { return this.name; } 

    // No setter;
}

Le classi immutabili sono utili perché sono thread-safe. Esprimono anche qualcosa di profondo sul tuo design: "Non posso cambiarlo". Quando si applica, è esattamente ciò di cui hai bisogno.




Come madrelingua inglese non madrelingua, non mi piace l'interpretazione comune di "classe immutabile" essendo "oggetti di classe costruiti sono immutabili"; piuttosto, mi propongo di interpretare questo come "l'oggetto di classe stesso è immutabile".

Detto questo, la "classe immutabile" è una specie di oggetto immutabile. La differenza sta nel rispondere a qual è il vantaggio. A mia conoscenza / interpretazione, la classe immutabile impedisce ai suoi oggetti di modificare il comportamento in fase di esecuzione.




Le classi immutabili non possono riassegnare i valori dopo l'istanziazione. Il costruttore assegna valori alle sue variabili private. Fino a quando l'oggetto non diventa null, i valori non possono essere modificati a causa della non disponibilità dei metodi di impostazione.

essere immutabile dovrebbe soddisfare il seguente,

  • Al le variabili dovrebbero essere private .
  • Non sono forniti metodi mutatori (setter).
  • Evitare l'override del metodo rendendo finale di classe (Strong Immutability) o metodi finali (immutabilità della settimana).
  • Clona profondamente se contiene classi non primitive o mutabili.
/**
* Strong immutability - by making class final
*/
public final class TestImmutablity {

// make the variables private
private String Name;

//assign value when the object created
public TestImmutablity(String name) {
this.Name = name;
}

//provide getters to access values
public String getName() {

return this.Name;
}
}

Avanzamenti: gli oggetti immutabili contengono i valori inizializzati fino alla morte.

java-immutable-classes-short-note




Links