java中的Immutable类意味着一旦创建了一个对象,我们就不能更改它的内容。在Java中,所有 包装类 (比如整数、布尔值、字节、短)和字符串类是不可变的。我们也可以创建自己的不可变类。在继续之前,一定要了解不变性的特性,以便在实现相同的特性时有一个很好的理解。以下是要求:
null
- 必须将该类声明为final,以便无法创建子类。
- 类中的数据成员必须声明为私有,因此不允许直接访问。
- 类中的数据成员必须声明为final,这样我们就不能在对象创建后更改它的值。
- 参数化构造函数应该初始化执行深度复制的所有字段,这样就不能用对象引用修改数据成员。
- 对象的深度复制应该在getter方法中执行,以返回一个副本,而不是返回实际的对象引用)
注: 不应该有设置器,或者更简单地说,不应该有更改实例变量值的选项。
实例
JAVA
// Java Program to Create An Immutable Class // Importing required classes import java.util.HashMap; import java.util.Map; // Class 1 // An immutable class final class Student { // Member attributes of final class private final String name; private final int regNo; private final Map<String, String> metadata; // Constructor of immutable class // Parameterized constructor public Student(String name, int regNo, Map<String, String> metadata) { // This keyword refers to current instance itself this .name = name; this .regNo = regNo; // Creating Map object with reference to HashMap // Declaring object of string type Map<String, String> tempMap = new HashMap<>(); // Iterating using for-each loop for (Map.Entry<String, String> entry : metadata.entrySet()) { tempMap.put(entry.getKey(), entry.getValue()); } this .metadata = tempMap; } // Method 1 public String getName() { return name; } // Method 2 public int getRegNo() { return regNo; } // Note that there should not be any setters // Method 3 // User -defined type // To get meta data public Map<String, String> getMetadata() { // Creating Map with HashMap reference Map<String, String> tempMap = new HashMap<>(); for (Map.Entry<String, String> entry : this .metadata.entrySet()) { tempMap.put(entry.getKey(), entry.getValue()); } return tempMap; } } // Class 2 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating Map object with reference to HashMap Map<String, String> map = new HashMap<>(); // Adding elements to Map object // using put() method map.put( "1" , "first" ); map.put( "2" , "second" ); Student s = new Student( "ABC" , 101 , map); // Calling the above methods 1,2,3 of class1 // inside main() method in class2 and // executing the print statement over them System.out.println(s.getName()); System.out.println(s.getRegNo()); System.out.println(s.getMetadata()); // Uncommenting below line causes error // s.regNo = 102; map.put( "3" , "third" ); // Remains unchanged due to deep copy in constructor System.out.println(s.getMetadata()); s.getMetadata().put( "4" , "fourth" ); // Remains unchanged due to deep copy in getter System.out.println(s.getMetadata()); } } |
输出
ABC101{1=first, 2=second}{1=first, 2=second}{1=first, 2=second}
在本例中,我们创建了最后一个名为Student的类。它有三个最终数据成员、一个参数化构造函数和getter方法。请注意,这里没有setter方法。另外,请注意,我们不需要对包装器类型的数据成员执行深度复制或克隆,因为它们已经是不可变的。 本文由 阿披实谢蒂 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END