所以我的讲师说了些什么:
将变量声明为protected会将它们暴露给所有子类,可能会导致维护问题,最好将变量声明为私有(即使在继承关系中)并编写getter和setter 提供变量访问的方法。
但他没有解释维修问题是什么。如果子类可以访问变量,那么会出现什么问题。
我对java很新,所以一个简单的解释会更有帮助
答案 0 :(得分:5)
假设您编写了一个带有protected
实例变量的类:
public class A {
protected int c;
}
现在,其他人可以扩展您的课程并直接使用c
变量:
public class B extends A {
public void someMethod () {
System.out.println(c + 5);
}
}
现在B
取决于班级c
的{{1}}成员。如果明天您决定删除该变量,或重命名该变量或更改其类型,A
将不会通过编译。
当您B
私有并提供getter和setter来访问它时,您可以自由更改c
而不会破坏扩展您的类的类。
答案 1 :(得分:1)
使用getter和setter方法,您可以控制更改或访问成员时发生的情况。例如,如果您在更改成员之前获得维护任务以执行某些检查,那么如果您使用setter方法设计了类,则可以轻松执行此操作。但是,如果该成员受到保护,则必须在所有子类中找到它的更改位置。您的维护任务包括重构子类,而不是仅仅对setter方法进行更改。
答案 2 :(得分:1)
查看 Effective Java 2nd Ed 第14项:“在公共课程中,使用访问者方法,而不是公共字段”。
这是在谈论一个稍微不同的情况(公共字段,而不是受保护的字段),但它很好地描述了为什么暴露类外的字段通常是值得避免的。从某种意义上说,受保护的字段是之类的公共字段,因为它们可以在类外部由任何子类访问。
特别相关的引用是:
您无法更改代表 在不更改API的情况下,您无法强制执行不变量,也无法执行 访问字段时的辅助操作。
换句话说,一旦你将字段暴露给子类,你就会承诺永远保留该字段作为字段,除非你能够更新所有子类(你几乎肯定不能,除非你在一个封闭的环境中工作。)