Rak*_*esh 1 java final immutability
我知道在java中传递对象时,对象的引用作为值传递.因此,您对该对象所做的更改也会反映在原始对象中.为避免这种情况,我们在java中使用immutability属性.
所以我的问题是,我创建了一个不可变类Employee,当我将这个Employee类的对象传递给其他类中的某个方法时,我不希望该方法对该对象进行任何更改.即使它确实如此,我也不希望更改受到调用类中创建的原始对象的影响.
这是我的示例代码.
public final class Employee {
int employeeId;
public int getId() {
return employeeId;
}
public void setId(int id) {
this.employeeId = id;
}
}
public class Worker {
public static void process(Employee f, Employee g){
int c = f.getId();
f.setId(g.getId());
g.setId(c);
}
}
public class ImmutabilityTest{
public static void main(String[] args) {
Employee teamMember = new Employee();
Employee teamLead = new Employee();
teamMember.setId(5);
teamLead.setId(10);
System.out.println("Before process "+teamMember.getId() + " " + teamLead.getId());
Worker.process(teamMember, teamLead);
System.out.println("After process "+teamMember.getId() + " " + teamLead.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是
Before process 5 10
After process 10 5
Run Code Online (Sandbox Code Playgroud)
有没有办法避免改变Employee类的成员变量的值?(除了制作它们final)如果没有那么我们如何在用户定义的类中实际利用java中的Immutability属性?
任何建议/意见/指针表示赞赏!谢谢..
不可变性不是Java中可以应用于具有单个关键字的Object的属性,它是一种需要根据具体情况实施的策略.一般来说,您可以使用final关键字和克隆来完成此任务.请注意,对象嵌套越深,实现真实对象不变性的难度就越大.
这是您的Employee类的(更多)不可变版本:
public class Employee {
final int employeeId;
public Employee(final int id) {
super();
this.employeeId = id;
}
public int getId() {
return employeeId;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使使用最终实例变量和克隆,Java中的反射也几乎不可能实现真正的不变性.