如何限制另一个类更改java中的属性

如何限制另一个类更改java中的属性,java,oop,encapsulation,Java,Oop,Encapsulation,根据封装,字段应该是私有的和公共的getter setter 但是使用setter有一种方法可以让另一个类改变私有字段的值,那么应该用什么方法来保护字段呢 请考虑本班讨论: class Emp { private String name; private int age; public Emp() {} // getters and setters public String getName() { return name;

根据封装,字段应该是私有的和公共的getter setter

但是使用setter有一种方法可以让另一个类改变私有字段的值,那么应该用什么方法来保护字段呢

请考虑本班讨论:

    class Emp {

    private String name;
    private int age;

    public Emp() {}

    // getters and setters

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

需要设置器时,请添加某种控件:

public void setName(String name) {
    if (name == null) {
        throw new IllegalArgumentException();
    }
    this.name = name;
}
使用java bean时,还可以使用角色:

@RolesAllowed("Administrator")
public void setName(String nam) {
    ...
}

需要设置器时,请添加某种控件:

public void setName(String name) {
    if (name == null) {
        throw new IllegalArgumentException();
    }
    this.name = name;
}
使用java bean时,还可以使用角色:

@RolesAllowed("Administrator")
public void setName(String nam) {
    ...
}

在构造函数中传递数据:

   class Emp {

    private String name;
    private int age;

    public Emp(String name, int age) {
      this.name = name;
      this.age = age;
    }

    // getters

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

在构造函数中传递数据:

   class Emp {

    private String name;
    private int age;

    public Emp(String name, int age) {
      this.name = name;
      this.age = age;
    }

    // getters

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

您可以使该类不可变

不可变对象是一个在不可变后不会改变状态的对象 实例化


使类成为final可以确保该类不能被子类化。此子类可能会增加可变性。

您可以使该类不可变

不可变对象是一个在不可变后不会改变状态的对象 实例化


使类成为final可以确保该类不能被子类化。此子类可能会增加易变性。

如果您不希望其他类能够通过setter更改字段,请不要提供setter。将setter声明为
private
具有相同的效果

你说:

根据封装,字段应该是私有的和公共的getter setter


实际上,实现封装的关键要求是将字段声明为
private
。这就是阻止其他类“看到”的原因,或者取决于属性的实现方式。提供getter和/或setter是可选的。

如果您不希望其他类能够通过setter更改字段,只需不提供setter即可。将setter声明为
private
具有相同的效果

你说:

根据封装,字段应该是私有的和公共的getter setter

实际上,实现封装的关键要求是将字段声明为
private
。这就是阻止其他类“看到”的原因,或者取决于属性的实现方式。提供getter和/或setter是可选的