Getter-Setter 和私有变量

2022-09-04 02:40:01

如果我可以通过 getter 返回的引用来更改私有变量的值,那么它不是绕过 setter 方法吗?难道它违背了 getter-setter 和私有变量的目的吗?

public class Test{

private Dimension cannotBeChanged;

public Test(int height, int width)
{
    if(height!=3)
       cannotBeChanged.height = height;
    if(width!=3)
       cannotBeChanged.width  = width;
}

public Dimension getDimension()
{
    return cannotBeChanged;
}


public void setDimension(int height, int width)
{
    if(height!=3)
       cannotBeChanged.height = height;
    if(width!=3)
       cannotBeChanged.width  = width;    
} 

 public static void main(String [] args)
{
    Test testOne = new Test(5,5);
    Dimension testSecond = testOne.getDimension();
    testSecond.height = 3; //Changed height and width to unwanted values
    testSecond.width= 3;
}

答案 1

是的,确实如此。我对 Clean Code book 中的 getters 和 setters 有以下结论;如果你真的接受它,你可以使用它。

  1. 非常邪恶:公共领域。
  2. 有点邪恶:不需要的Getters和setters。
  3. 好:Getters 和 setter 只在真正需要的地方 - 使类型公开碰巧使用其状态的“更大”行为,而不仅仅是将类型视为要由其他类型操作的状态存储库。

答案 2

程序员应该设计外部实体接触其程序的安全变量的方法。

  1. 切勿为对象的安全属性创建任何 setter。只能提供一个 getter。
  2. 仅为这些属性创建 setter,这些属性在程序过程中可能会更改。
  3. 如果要对某些属性应用某些限制,请使用 setters,例如应用无效值检查、预填充、逻辑分析、填充另一个依赖属性、防御性复制等
  4. Getters/setters有助于维护系统的软件熵。阅读有关软件熵的信息
  5. 不要在不需要的地方创建 getters/setters,因为它会导致样板代码。
  6. Getters/setters有助于改变未来程序扩展的底层实现,例如升级日志记录库等

推荐