Inmutabilidad en Java

Hola, Habr. Anticipándonos al inminente inicio del curso de preparación para la certificación de programador de Oracle Java (OCAJP), hemos preparado una traducción tradicional del material para usted.



También invitamos a todos a participar en la lección de demostración abierta "Constructores y bloques de inicialización". En este webinar gratuito, nosotros:

- Desmontaremos el constructor por partes

- Definiremos los finalistas (variables finales)

- Pondremos las cosas en orden (inicializaciones)






Una clase inmutable es una clase que, después de la inicialización, no puede cambiar su estado. Es decir, si el código contiene una referencia a una instancia de una clase inmutable, cualquier cambio en él conducirá a la creación de una nueva instancia.





Para que una clase sea inmutable, debe cumplir con los siguientes requisitos:





  • final, . .





  • .





  • , .





  • , .





  • - , .





, , , :





import java.util.Map;
public final class MutableClass {
  private String field;
  private Map<String, String> fieldMap;
public MutableClass(String field, Map<String, String> fieldMap) {
  this.field = field;
  this.fieldMap = fieldMap;
}
public String getField() {
  return field;
}
public Map<String, String> getFieldMap() {
  return fieldMap;
}
}
      
      



.





import java.util.HashMap;
import java.util.Map;
public class App {
public static void main(String[] args) {
  Map<String, String> map = new HashMap<>();
  map.put("key", "value");
    
  //   "" 
  MutableClass mutable = new MutableClass("this is not immutable", map);
  //      map ==  
  mutable.getFieldMap().put("unwanted key", "another value");
  mutable.getFieldMap().keySet().forEach(e ->  System.out.println(e));
}
}
//   
unwanted key
key
      
      



, , , .





import java.util.HashMap;
import java.util.Map;
public class AlmostMutableClass {
  private String field;
  private Map<String, String> fieldMap;
public AlmostMutableClass(String field, Map<String, String> fieldMap) {
  this.field = field;
  this.fieldMap = fieldMap;
}
public String getField() {
  return field;
}
public Map<String, String> getFieldMap() {
  Map<String, String> deepCopy = new HashMap<String, String>();
  for(String key : fieldMap.keySet()) {
    deepCopy.put(key, fieldMap.get(key));
  }
  return deepCopy;
}
}
      
      



getFieldMap



, , AlmostMutableClass



. , Map



, getFieldMap



, , map



. map



, . 





map



, , . , .





import java.util.HashMap;
import java.util.Map;
public class App {
public static void main(String[] args) {
  Map<String, String> map = new HashMap<>();
  map.put("good key", "value");
    
  //   "" 
  AlmostMutableClass almostMutable = new AlmostMutableClass("this is not immutable", map);
  
  //       
  //      map
  System.out.println("Result after modifying the map after we get it from the object");
  almostMutable.getFieldMap().put("bad key", "another value");
  almostMutable.getFieldMap().keySet().forEach(e -> System.out.println(e));
  
  System.out.println("Result of the object's map after modifying the initial map");
  map.put("bad key", "another value");
  almostMutable.getFieldMap().keySet().forEach(e -> System.out.println(e));
    
  }
}
//   
Result after modifying the map after we get it from the object
good key
Result of the object's map after modifying the initial map
good key
bad key
      
      



, , getFieldMap



. :





public AlmostMutableClass(String field, Map<String, String> fieldMap) {
  this.field = field;      
  Map<String, String> deepCopy = new HashMap<String, String>();
  for(String key : fieldMap.keySet()) {
    deepCopy.put(key, fieldMap.get(key));
  }
  this.fieldMap = deepCopy;
}
//   
Result after modifying the map after we get it from the object
good key
Result of the object's map after modifying the initial map
good key
      
      



, . , , .





, , , .





Java

String



, , , Java. — , .





, String



, , , . - Java (Integer, Boolean ..), String







:





  • .





  • , " ". String







  • , .





  • String -, -, String



    .





  • , , , .






« Oracle Java Programmer (OCAJP)».





« ».








All Articles