java中的不变性

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属性?

任何建议/意见/指针表示赞赏!谢谢..

Per*_*ion 5

不可变性不是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中的反射也几乎不可能实现真正的不变性.