Javaの不変性

こんにちは、Habr。Oracle Javaプログラマー認定準備(OCAJP)コースの開始が間近に迫っていることを見越して、資料の従来の翻訳を用意しました。



また、オープンデモレッスン「コンストラクタと初期化ブロック」にぜひご参加ください。この無料のウェビナーでは、次のことを行います。-

パーツコンストラクターを逆アセンブルします

-ファイナリストを定義します(最終変数)

-物事を整理します(初期化)






不変クラスは、初期化後に状態を変更できないクラスです。つまり、コードに不変クラスのインスタンスへの参照が含まれている場合、コードを変更すると、新しいインスタンスが作成されます。





クラスが不変であるためには、次の要件を満たしている必要があります。





  • 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