Kekekalan di Jawa

Halo, Habr. Untuk mengantisipasi permulaan kursus Oracle Java Programmer Certification Preparation (OCAJP), kami telah menyiapkan terjemahan tradisional dari materi tersebut untuk Anda.



Kami juga mengundang semua orang untuk berpartisipasi dalam pelajaran demo terbuka "Pembuat dan Blok Inisialisasi". Pada webinar gratis ini, kami:

- Kami akan membongkar konstruktor untuk bagian

- bagian - Menentukan finalis (variabel akhir)

- Menata semuanya (inisialisasi)






Kelas yang tidak dapat diubah adalah kelas yang, setelah inisialisasi, tidak dapat mengubah statusnya. Artinya, jika kode tersebut berisi referensi ke sebuah instance dari kelas yang tidak dapat diubah, maka setiap perubahan di dalamnya mengarah pada pembuatan instance baru.





Agar kelas tidak dapat diubah, itu harus memenuhi persyaratan berikut:





  • 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