Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类层次结构,如何实现可选变量_Java_Design Patterns_Interface_Polymorphism_Abstract Class - Fatal编程技术网

Java类层次结构,如何实现可选变量

Java类层次结构,如何实现可选变量,java,design-patterns,interface,polymorphism,abstract-class,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; } 很简单。现在我有了另一个抽象类,它扩展了这个类,还有几个抽象类扩展了那个

我想知道是否有任何“干净”的方法可以在整个类层次结构中实现一个可选变量,而不必一直保持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的实例。将创建大量项目。项层次结构中任何类的某些实例都会有它,而有些则不会。程序在编译时无法判断。我无法将层次结构分成两个独立但几乎相同的树,一个有MyObject,一个没有MyObject。这将导致大量代码重复。用另一个包含MyObject的具体类对具体实现进行子类化将意味着过度的类型检查,这将变得很糟糕,尤其是当层次结构增长时。将接口/抽象类放在更高的位置也不是一个选项,因为这会将MyObject放在所有内容中。无论采用何种解决方案,所有这些都必须有一个公共接口/抽象类


我可能会吹毛求疵,应该在层次结构的顶部实现MyObject,然后对其进行null检查,或者使用简单的布尔方法告诉我它是否存在,但我还是觉得有点草率,如果可能的话,我想找到一个更好的解决方案。

你对问题的描述让我想起了Decorator模式的动机——一个过度增长的类层次结构,带有某种想要的“多重继承”和“超级类的组合”。请看一下internet上的说明,例如,请看一下/Writer标准Java类是如何实现的。

没有干净的方法。通常这意味着你的类层次结构有点古怪,应该重构……我试过了,但我找不到合理的重构方法来将两者分开。MyObject的存在增加了一项额外的功能,但不会改变每个项中的任何其他字段/方法。除此之外的类将在项目集合上迭代,并确定哪些项目具有MyObject,而MyObject将基于该附加功能将它们分开(至少在用户看来是这样,而不是在代码中)。把它看作是有或没有A/C的各种汽车的列表,但是如果A/C存在,我们需要知道什么样的类型,它是如何运作的等等。一个简单的标志是不行的。你是否考虑从层次结构中去掉可选的部分,并使用构图来把它们放在需要的地方?我认为在这里,构图不会起到作用。其构建方式是,项目主要是数据容器,没有太多的行为方式。例如,可能会显示一个视图,其中包含按名称变量列出的项目列表。单击其中一个将显示该项目的详细信息以及可能采取的行动,这些行动基于该项目的各种属性。我可以考虑采取这些行动,以及根据与每个项目直接相关的行为呈现什么,但这可能很棘手……好吧,我想我有一个解决方案不是完美的,而是更干净的。Item现在是两个具体类的接口:MyObjectItem和StandardItem。这样,一个单一的类型检查将确定MyObject是否存在,这不是完美的,但比空检查IMHO更干净。每一个都包含一个WrappedItem,它现在是前一个Item子类的父类。这是一个额外的层,但它似乎运行得足够好,我想我可能已经找到了一种方法来消除以前在它们上进行的一些类型检查。