Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
验证Java中接口中默认方法中的条件_Java_Design Patterns_Interface_Default - Fatal编程技术网

验证Java中接口中默认方法中的条件

验证Java中接口中默认方法中的条件,java,design-patterns,interface,default,Java,Design Patterns,Interface,Default,我的接口中有一个由许多类实现的方法: public interface MyInterface { Message createMessage(List<String> rawStrings); } 有人建议我将validate条件移到接口上,但这样做,我将失去强制实现接口的类来实现此方法的能力 这看起来是个好主意吗 default Message createMessage(List<String> rawStrings) { Validate.isT

我的接口中有一个由许多类实现的方法:

public interface MyInterface {
    Message createMessage(List<String> rawStrings);
}
有人建议我将validate条件移到接口上,但这样做,我将失去强制实现接口的类来实现此方法的能力

这看起来是个好主意吗

default Message createMessage(List<String> rawStrings) {
    Validate.isTrue(!rawStrings.isEmpty(), "No rawstrings present");
    return null;
}
默认消息createMessage(列出原始字符串){
Validate.isTrue(!rawStrings.isEmpty(),“不存在rawStrings”);
返回null;
}

这是在接口中使用默认方法的好方法吗?如何确保实现
MyInterface
的类也实现了方法
createMessage

default关键字的最初目的是在不破坏现有实现的情况下向现有接口添加功能。Java语言团队将此方法视为不情愿的解决方案(即,不是强制所有
List
实现实现一个新方法,而是将
default
方法添加到
List
)。通常,不希望将公共代码移动到
默认方法中

引入抽象基类(ABC)通常是更好的方法:

公共接口MyInterface{
消息createMessage(列出原始字符串);
}
公共抽象类MyAbstractBaseClass实现MyInterface{
@凌驾
公共消息createMessage(列表字符串){
Validate.isTrue(!rawStrings.isEmpty(),“不存在rawStrings”);
createValidMessage(原始字符串);
}
受保护的抽象消息createValidMessage(列表字符串);
}
然后,每个实现类扩展ABC:

public class MyClass extends MyAbstractBaseClass {

    @Override
    protected Message createValidMessage(List<String> rawStrings) {
        // ...do something...
    }
}
公共类MyClass扩展了MyAbstractBaseClass{
@凌驾
受保护的消息createValidMessage(列表字符串){
//…做点什么。。。
}
}

这是的一个实现,它要求实现类仅提供验证后逻辑

default
关键字的最初目的是在不破坏现有实现的情况下向现有接口添加功能。Java语言团队将此方法视为不情愿的解决方案(即,不是强制所有
List
实现实现一个新方法,而是将
default
方法添加到
List
)。通常,不希望将公共代码移动到
默认方法中

引入抽象基类(ABC)通常是更好的方法:

公共接口MyInterface{
消息createMessage(列出原始字符串);
}
公共抽象类MyAbstractBaseClass实现MyInterface{
@凌驾
公共消息createMessage(列表字符串){
Validate.isTrue(!rawStrings.isEmpty(),“不存在rawStrings”);
createValidMessage(原始字符串);
}
受保护的抽象消息createValidMessage(列表字符串);
}
然后,每个实现类扩展ABC:

public class MyClass extends MyAbstractBaseClass {

    @Override
    protected Message createValidMessage(List<String> rawStrings) {
        // ...do something...
    }
}
公共类MyClass扩展了MyAbstractBaseClass{
@凌驾
受保护的消息createValidMessage(列表字符串){
//…做点什么。。。
}
}

这是的一个实现,它要求实现类仅提供验证后逻辑

这可能是一个更好的问题。您可能需要查找面向方面编程和AspectJ。对于您来说,这可能是一个更好的问题。您可能需要查找面向方面编程和AspectJ。由于问题标有
设计模式
,因此请注意此答案是正确的。@jaco0646谢谢您的建议。我已经更新了答案。由于问题标有
设计模式
,请注意此答案是正确的。@jaco0646谢谢您的建议。我已经更新了答案。
public class MyClass extends MyAbstractBaseClass {

    @Override
    protected Message createValidMessage(List<String> rawStrings) {
        // ...do something...
    }
}