Java类层次结构,如何在整个过程中实现可选变量

时间:2013-07-05 05:34:23

标签: java design-patterns interface polymorphism abstract-class

我想知道是否有任何“干净”的方法在整个类层次结构中实现一个可选变量,而不是简单地将其保留为null并且始终为null。假设我有以下抽象父类:

public abstract class Item {

public String name;

public Item(String name){
    this.name = name;
}

public String getName(){
    return name;
}

非常简单。现在我有另一个扩展这个的抽象类,还有一个扩展了这个类的抽象类,每个类都有一些自己的附加变量/方法。 Item还有一个扩展它的存根类(只有一个调用super()的构造函数),如果可以使Item具体化,则可能不需要,但这取决于解决方案。

现在,让我们说这些具体类中的任何一个都可能包含MyObject的实例。将创建大量项目。 Item层次结构中任何类的某些实例都有它,有些则不会。程序在编译时无法告诉它。我无法将层次结构分成两个独立但几乎相同的树,一个是MyObject,另一个是没有。这将导致大量的代码重复。使用包含MyObject的另一个具体类对具体实现进行子类化将意味着过度的类型检查,这会变得很难看,尤其是在层次结构增长的情况下。进一步放置接口/抽象类也不是一种选择,因为这会将MyObject放在所有内容中。无论解决方案如何,所有这些都必须具有通用接口/抽象类。

我可能会挑剔,应该只在层次结构的顶部实现MyObject并对其进行null检查,或者使用一个简单的布尔方法来告诉我它是否存在,但它对我来说仍然感觉有点草率,我想要如果可能的话,找到更好的解决方案。

1 个答案:

答案 0 :(得分:0)

你对问题的描述让我想起了Decorator模式的动机 - 一个过度生长的类层次结构,带有某种想要的“多重继承”和“超类组合”。看看互联网上Decorator的描述,并举例说明如何实现Reader / Writer标准Java类。