Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为抽象方法编写合同?_Java_Design Patterns_Design By Contract - Fatal编程技术网

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

我在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
的输出是否满足约定(在本例中,最后一个字符必须是新行字符)

我想我可以做到这一点(但我不知道是否有更好的方法)


希望这不是太模糊。感谢您的帮助。

正是这样。您必须创建您的方法,并在其上使用
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";
     }
}