こんにちは、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)».