Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
使用Java8默认方法的访问者模式_Java_Oop_Design Patterns_Visitor Pattern_Default Method - Fatal编程技术网

使用Java8默认方法的访问者模式

使用Java8默认方法的访问者模式,java,oop,design-patterns,visitor-pattern,default-method,Java,Oop,Design Patterns,Visitor Pattern,Default Method,是一种非常有用的模式,但如果将任何新成员添加到继承层次结构中(这是一个有效点),通常会仔细检查它是否破坏接口 但是在Java8中引入默认方法之后,现在我们可以在接口中定义默认实现,客户机接口不会中断,客户机可以适当地采用更改后的接口 interface Visitor{ public void visit(Type1 type); public void visit(Type2 type); //added after the first version of visitor

是一种非常有用的模式,但如果将任何新成员添加到继承层次结构中(这是一个有效点),通常会仔细检查它是否破坏接口

但是在Java8中引入默认方法之后,现在我们可以在接口中定义默认实现,客户机接口不会中断,客户机可以适当地采用更改后的接口

interface Visitor{
   public void visit(Type1 type);
   public void visit(Type2 type);

   //added after the first version of visitor is released
   default public void visit(NewType type){
        //some default implementation
   }
}
现在使用默认方法,如果将来引入新类型
NewType
,则不再破坏客户机代码


这是否使访问者更易于接受和使用?

您的问题包含一个隐含的断言,即访问者必须是
接口。由于访问者模式不是特定于Java的,因此它不要求这样的实现

事实上,在世界各地,有很多用户为访问者使用
abstract
类,或者使用
interface
但同时提供
abstract
实现类

虽然有可能在编译时检测到未处理的情况,但这仅适用于每个访问者始终必须为每个
访问
方法提供实现的情况。当您有很多案例时,这可能会导致代码膨胀(并且可能会导致其他开发人员为其访问者编写自己的
抽象
基类)

如前所述,并不是每个人都以这种方式使用访问者模式。许多实现使用
abstract
类来提供空的
visit
方法或
visit
方法,这些方法委托给另一个采用更抽象类型的
visit
方法。对于这些实现,添加新类型从来都不是问题


而且,为了回答您的问题,当以不强制每个访问者为每个方法提供实现的方式使用访问者模式时,可以选择在接口中使用
default
方法。但它并没有使访问者模式“更易于接受和有用”,因为它从来没有真正的问题。使用
abstract
visitor类的选项始终存在。

我个人认为,大多数情况下,界面中断是一种优势,因为它迫使您在任何地方都要注意新类型,而不必担心错过一个类似于测试实例链的地方。将新的visit()方法实现为默认方法将提供一个默认实现,我想这在99%的情况下都是错误的。如果您知道代码在运行时不会执行它应该执行的操作,那么谁会在乎代码是否仍然可以编译呢?@JBNizet-Yes。只是访客有一个缺点,我认为这是不适用的。但我明白了为什么不应该对访问者使用默认方法。我同意,访问者模式与编译错误有关。如果代码未在运行时之前中断,则称为。在客户那里,太晚了。