ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 如何为抽象方法编写合同?

2019-06-21 21:00:36  阅读:233  来源: 互联网

标签: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 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有