Java – 包含变量的抽象类?

让抽象类定义实例变量是一种好习惯吗?

public abstract class ExternalScript extends Script { String source; public abstract void setSource(String file); public abstract String getSource(); } 

然后子类ExternalJavaScript.class会自动获取源变量,但是如果所有子类本身都定义了源代码而不是inheritance,我觉得读代码更容易。

你有什么建议吗?

/亚当

我会认为这样的事情要好得多,因为你要添加一个变量,为什么不限制访问并使其更清洁? 你的getter / setter应该按照他们在锡上说的做。

 public abstract class ExternalScript extends Script { private String source; public void setSource(String file) { source = file; } public String getSource() { return source; } 

回过头来回答这个问题,你是否曾经在阅读它时看看getter / setter代码的位置? 如果他们都进行了设置,那么在阅读代码时你不需要担心函数的function。 还有一些其他原因需要考虑:

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

总是想想你的class级是否真的是一个不同的东西,这应该有助于决定你是否还需要更多东西。

当然..为什么不呢?
为了提高存储和维护效率,抽象基类只是为了容纳两个或多个类共同的容纳行为和数据的便利。 它是一个实现细节。
但请注意,您没有使用应该使用接口的抽象基类。 请参阅Interface vs Base类

当然。 抽象类的整个想法是它们可以包含一些您需要包含所有子类的行为或数据。 想想WheeledVehicle的简单例子 – 它应该有一个numWheels成员变量。 您希望所有子类都具有此变量。 请记住,抽象类在开发API时是一个非常有用的function,因为它们可以确保扩展API的人不会破坏它。