清晰界定问题的边界
虽然我试图在标题中说清楚,但我会重申这个问题的重点是以下条件组合:
- Getters 只返回对应字段的值,没有别的。
- 设置器只设置相应字段的新值,没有别的。
- getter 和 setter 都是公开的
因此,诸如“setter 不仅可以设置一个值,还可以做其他事情”或“setter 可以设为私有,从而使特定字段成为只读”之类的答案不会回答所提出的问题。
正在考虑的案例中 getter 和 setter 无用的理由
在教授支持 OOP 的语言时,通常会说这样的话:
使用修饰符隐藏字段
private
或protected
通过公共 getter 和 setter 从外部访问它们是一种很好的做法。
至于你不应该打开类用户不需要的字段这一事实,没有人反对 - 一切都是理性的。但是这个问题是关于那些需要从外部访问的字段。并且他们也应该被私有化并且公共的 getters 和 setters 应该被添加到他们的声明听起来像一个背景不清楚的教条。
例如,这个 Java 类:
class Person {
private String name;
private String email;
public String getName() {
return this.name;
}
public void setName(String newName) {
this.name= newName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String newEmail) {
this.email = newEmail;
}
}
不同于班级
class Person {
public String name;
public String email;
}
只是以一种复杂的方式访问字段name
and email
,但结果是,用户仍然可以读取和更改这些字段,因此不清楚人们常说的“使用 getter 和 setter 更安全”的依据是什么。
一般来说,在 C# 中,有一个传统是用 getter 和 setter 覆盖所有字段:
public class Person
{
public string Name { get; set; };
public string Email { get; set; };
}
再说一次:与下面的代码相比,它是否真的提供了一些东西,或者它只是某种抽象的最佳实践,比如“每个人都这样做,你也这样做”?
public class Person
{
public string Name;
public string Email;
}
对你的问题的简短回答是肯定的。
但是有一个小小的“但是”。如果您的此类代码在另一个程序集中使用,那么您将失去二进制兼容性。
也许,在你的程序的未来版本中,你仍然想利用属性相对于字段的优势之一(例如,添加值检查、挂起事件调用等),你将把你的字段包装在一个财产,即使同名。在这种情况下,所有使用您的代码(您的程序集)的程序集,尽管它们在语法上仍然是正确的,但在重新编译之前将停止工作。您的和第三方的,其开发人员已决定使用您的程序集。
如果在您的或第三方程序集中对您的代码使用了反射,那么不仅需要重新编译,而且可能还需要进行代码更正。