gpt4 book ai didi

java - 如何为抽象方法编写契约?

转载 作者:搜寻专家 更新时间:2023-11-01 02:33:36 24 4
gpt4 key购买 nike

我在我的 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方法:

  • 您需要完成算法,以控制子类化行为。通过禁止子类通过 final 关键字覆盖模板方法,可以确保可以在模板中实现足够的检查,以确保算法中的不变量保持良好。
  • 您需要允许子类覆盖可能发生变化的行为。子类可以完全重写这个行为,而这样的方法在父类中通常是抽象的,通常作为子类实现钩子(Hook)的地方。

模板方法可以在您的示例中实现为

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com