可以使用界面的默认方法来描述行为/场景吗?我的意思是描述方法调用的顺序。 简单示例:
public interface ExportService {
Order getOrder(long id);
void validateOrder(Order order);
void processOrder(Order order);
void processException(e);
//is this bad?
default void executeOrder(long id) {
try {
Order order = getOrder(id);
validateOrder(order);
processOrder(order);
} catch (Exception e) {
processException(e);
}
}
}
任何链接或最佳做法都将非常棒! 谢谢
在这种情况下,是否更正确:
public interface ExportService {
Order getOrder(long id);
void validateOrder(Order order);
void processOrder(Order order);
void processException(e);
}
public abstract class AbstractExportService implements ExportService {
public abstract Order getOrder(long id);
public abstract void validateOrder(Order order);
public abstract void processOrder(Order order);
public abstract void processException(e);
protected void executeOrder(long id) {
try {
Order order = getOrder(id);
validateOrder(order);
processOrder(order);
} catch (Exception e) {
processException(e);
}
}
}
答案 0 :(得分:1)
应在接口的Javadoc和方法的Javadoc中描述方法调用的正确顺序。那是您界面的用户应该去学习界面契约的地方。
定义default
方法只是其他方法用法的一个例子,这毫无意义。如果从不希望实现接口的类实现该方法,则没有必要在接口中添加方法。
此外,该default
方法不能强制您界面的用户按所需顺序使用其他方法。在Javadoc中描述接口的正确用法也不会强制接口的用户正确使用接口,但是如果他们不遵守合同,并且接口不能按预期工作,也不要感到惊讶
答案 1 :(得分:0)
您似乎想要实现的是应用 Template Method设计模式(GoF book中描述的行为模式)。
该模式的目的是为步骤指定一个带有占位符的框架算法。这样的结果是,您可以通过模板方法来帮助确保客户端代码(间接)以正确的顺序调用方法。
在您的情况下,executeOrder
是模板方法,抽象方法是占位符,由子类实现。
您的第二个代码片段非常类似于Template Method模式的典型应用程序。有点不对劲的地方是公开了step方法,以便客户可以违反您的订购约束。为了确保遵守订购约束,通常的解决方案是让您:
executeOrder
声明为public
和final
,因此它是代码的唯一入口点; protected
中步骤的方法,以使包外部的客户端无法直接调用它们。