验证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...
}
}