在java中与受保护变量相关的维护问题

时间:2017-02-16 10:30:50

标签: java protected

所以我的讲师说了些什么:

  

将变量声明为protected会将它们暴露给所有子类,可能会导致维护问题,最好将变量声明为私有(即使在继承关系中)并编写getter和setter   提供变量访问的方法。

但他没有解释维修问题是什么。如果子类可以访问变量,那么会出现什么问题。

我对java很新,所以一个简单的解释会更有帮助

3 个答案:

答案 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的情况下,您无法强制执行不变量,也无法执行   访问字段时的辅助操作。

换句话说,一旦你将字段暴露给子类,你就会承诺永远保留该字段作为字段,除非你能够更新所有子类(你几乎肯定不能,除非你在一个封闭的环境中工作。)