Java 如何为抽象方法编写合同?
我在Java项目中使用合同。(合同=在方法的开始和结束时进行检查) 我想知道是否有一种很好的方法/模式来为泛型方法编写契约。例如:Java 如何为抽象方法编写合同?,java,design-patterns,design-by-contract,Java,Design Patterns,Design By Contract,我在Java项目中使用合同。(合同=在方法的开始和结束时进行检查) 我想知道是否有一种很好的方法/模式来为泛型方法编写契约。例如: public abstract class AbstractStringGenerator{ /** * This method must return a new line as it's last char * @return string output */ public abstract string gene
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
的输出是否满足约定(在本例中,最后一个字符必须是新行字符)
我想我可以做到这一点(但我不知道是否有更好的方法)
希望这不是太模糊。感谢您的帮助。正是这样。您必须创建您的方法,并在其上使用
final
修饰符,以便任何人都不能重写合同。在这种方法中,您检查合同并调用一个内部方法(您的generateLineHook(String)
),无需再做任何事情。我定期使用代码合同,有时有定义良好的自描述方法,很难编写合同
我不了解Java(我假设您正在使用iContract或其他东西),但在C#/代码契约中,我会:
Contract.Ensures(result[result.Length-1] == @"\n");
或者类似的东西
我不知道你说有更好的方法来做这件事是什么意思。这看起来像是使用电脑的地方。使用模板方法模式,一般算法可以在抽象类中实现和最终确定,而一些细节可以在子类中实现 要实现模板方法,请执行以下操作:
- 您需要完成算法,以控制子类化行为。通过禁止子类通过final关键字重写模板方法,可以确保在模板中实现足够的检查,以确保算法中的不变量保持良好
- 您需要允许子类重写可能发生变化的行为。子类可以完全重写此行为,并且此类方法通常在父类中是抽象的,通常充当子类可以实现挂钩的位置
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";
}
}
我相信这是一个很好的方法,只要记住在公共方法中添加一个“final”,这样子类就不能覆盖您的检查。谢谢,模板方法设计模式正是我想要的。谢谢,但我是在寻找模板类设计模式(如回答所示)。另一方面,我跟进了iContract(我们正在使用内部实现),并在维基百科中找到了一个相当长的java欢呼列表:)
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";
}
}