使用 getter 访问私有实例变量是一个好的编码习惯吗

Is it a good coding practice to use getter for accessing private instance variables

最近我收到一条代码审查评论,使用 getter 方法访问相同 class 方法中的私有实例变量。这真的是一个好习惯吗?我觉得它在代码中增加了不必要的复杂性。推荐的方式是什么?

public class SomeClass {
    String abc;

    public boolean compare(SomeClass otherClass) {
        otherClass.getAbc().equals(abc);
    }
}

public class SomeClass {
    String abc;

    public boolean compare(SomeClass otherClass) {
        otherClass.getAbc().equals(getAbc());
    }
}

我发现您的第一种方法存在一个非常具体的问题。您使用的 getters 不一致。

public boolean compare(SomeClass otherClass) {
    otherClass.getAbc().equals(abc);
    //.getAbc() for one, but direct access for the other!!
}

您必须使用 equals 方法比较苹果与苹果,并且如果使用 getter(我假设是 public 并且可以覆盖)检索您的变量之一进行比较,并且另一个是直接从私有变量(不能被覆盖)中检索的,那么你已经使你的代码比它需要的更脆弱。如果有人扩展了您的 class 并更改了 getter 方法怎么办?您的代码将被处理。因此,在两者或 none.

上使用 getter

考虑到这一点,这些都比你原来的要好,因为行为更稳定:

public boolean compare(SomeClass otherClass) {
    otherClass.abc.equals(abc);
}


public boolean compare(SomeClass otherClass) {
    otherClass.getAbc().equals(getAbc());
}

对于一般用途,这取决于您使用数据的方式。 David 的回答列出了 getters.

的一般用法的一些资源

您的审稿人完全有可能只是在谈论一般情况,但我认为他们可能只是没有很好地传达问题。

理论上,在 class 中使用 getter 和 setter 可以提供代码重用,例如,如果 setter 进行某种范围检查,这在 class 还有。在实践中,我从未见过这真正有益的案例。

理想情况下 class 根本不应该有 setters 和吸气剂。

为什么没有 setter?因为它们提供了导致很多问题的可变状态。 Class 理想情况下,变量应该在构造函数中赋值,以后永远不会改变。

为什么没有吸气剂?因为一个 class 应该作为一个单元。创建 class 的目的不仅仅是为不同的变量提供一个临时容器,只是为了稍后将它们一个一个地提取出来。那不是封装。