Java - 包含变量的抽象类?

2022-09-01 10:40:56

让抽象类定义实例变量是一种好的做法吗?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

子类 ExternalJavaScript.class 将自动获取源变量,但我认为如果所有子类本身都定义了源,而不是从继承中,则更容易阅读代码。

你有什么建议?

/亚当


答案 1

我本来以为这样的东西会更好,因为你正在添加一个变量,所以为什么不限制访问并使其更干净呢?你的撬棍/二传手应该按照他们在铁罐上说的话去做。

public abstract class ExternalScript extends Script {

    private String source;

    public void setSource(String file) {
        source = file;
    }

    public String getSource() {
        return source;
    }
}

回到这个问题,你有没有在阅读时费心去看getter/setter代码在哪里?如果它们都执行 get 和设置,则无需担心函数在读取代码时“做什么”。还有其他一些原因需要考虑:

  • 如果源代码受到保护(因此子类可以访问),那么代码就会变得混乱:谁在更改变量?当它是一个对象时,当你需要重构时,它就会变得困难,而方法往往会使这一步变得更容易。
  • 如果你的 getter/setter 方法没有获取和设置,那么将它们描述为其他内容。

总是想想你的班级是否真的是另一回事,这应该有助于决定你是否需要更多的东西。


答案 2

确定。。为什么不呢?
摘要 基类只是一个方便地将2个或更多类的行为和数据放在一个地方,以提高存储和维护的效率。这是一个实现细节。
但是,请注意,您没有在应该使用接口的地方使用抽象基类。请参阅接口与基类