java – 如何为抽象方法编写合同?
作者:互联网
我在我的Java项目中使用契约. (合同=在方法的开始和结束时进行检查)
我想知道是否有一个很好的方式/模式来编写泛型方法的合同.例如:
public abstract class AbstractStringGenerator{
/**
* This method must return a new line as it's last char
* @return string output
*/
public abstract string generateLine(String input);
}
我想要的是检查generateLine的输出是否满足合约的好方法(在这种情况下,最后一个char必须是新行char).
我想我能做到这一点(但我想知道是否有更好的方法);
public abstract class AbstractStringGenerator{
public string generateLine(String input){
string result = generateLineHook(input);
//do contract checking...
//if new line char is not the last char, then throw contract exception...
return result;
}
/**
* This method must return a new line as it's last char
* @return string output
*/
protected abstract string generateLineHook(String input);
}
希望这不是太模糊.任何帮助赞赏.
解决方法:
这看起来像是使用Template Method design pattern的地方.使用模板方法模式,可以在抽象类中实现和最终确定通用算法,而某些细节可以在子类中实现.
为了实现Template方法:
>您需要最终确定算法,以控制子类化行为.通过禁止子类通过final关键字覆盖模板方法,可以确保可以在模板中实现足够的检查以确保算法中的不变量保持良好.
>您需要允许子类覆盖可能变化的行为.子类可以完全覆盖此行为,并且此类方法通常在父类中是抽象的,通常用作子类可以实现挂钩的位置.
Template方法可以在您的示例中实现为
public abstract class AbstractStringGenerator{
// marked as final. Subclasses cannot override this behavior
public final String generateLine(String input){
String result = generateLineHook(input);
//do contract checking...
//if new line char is not the last char, then throw contract exception...
if(!result.endsWith("\n")){
throw new IllegalStateException("Result from hook does not contain new line");
}
return result;
}
/**
* This method must return a new line as it's last char
* @return string output
*/
protected abstract string generateLineHook(String input);
}
public class ConcreteStringGenerator{
/**
* This method overrides the beh
* @return string output
*/
protected String generateLineHook(String input){
return "blah\n";
}
}
标签:java,design-patterns,design-by-contract 来源: https://codeday.me/bug/20190621/1257652.html