作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的 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
的输出是否满足约定的好方法(在这种情况下,最后一个字符必须是换行字符)。
我想我可以做到这一点(但我想知道是否有更好的方法);
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方法:
模板方法可以在您的示例中实现为
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 - 如何为抽象方法编写契约?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510946/
我是一名优秀的程序员,十分优秀!