使用 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 的目的不仅仅是为不同的变量提供一个临时容器,只是为了稍后将它们一个一个地提取出来。那不是封装。
最近我收到一条代码审查评论,使用 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 的目的不仅仅是为不同的变量提供一个临时容器,只是为了稍后将它们一个一个地提取出来。那不是封装。