如何定义" isValid"功能

时间:2016-08-21 06:19:46

标签: java error-handling

我正在尝试在我的文件生成程序中建模一些状态, 在某一点上:

  1. 我想查看数据的当前状态
  2. 如果数据有效我想继续
  3. 否则我想通知用户我无法继续的原因
  4. psudocode就像:

    if(isValid()){
        writeFile()
    } else {
        switch(getReason()){
            case FAIL1: doSomething1();
                break;
            case FAIL2: doSomething2();
                break;
            case FAIL3: doSomething3();
                break;
        }
    }
    

    不确定这样的方法是否正确,想要您的建议/意见。其中:总共少于10个错误状态,并且在给定时间只有一个错误状态适用。

2 个答案:

答案 0 :(得分:0)

我会为您的enum创建一个Reason,并将您原因的所有具体信息放在那里。然后,您可以使用原因中的特定信息对doSomething方法进行参数化。听起来像这样可能是String。使用这种方法,扩展代码要容易得多。 代码可能如下所示:

if(isValid()){
    writeFile()
} else { Reason reason = getReason(); 
    doSomething(reason.getMessage());
}

使用您的枚举Reason

enum Reason {
    REASON1("message1"), REASON2("message2")/* ... */;

    private String message;

    private Reason(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

}

答案 1 :(得分:0)

来自加尔诺夫的想法正朝着一个好方向发展;但在OO术语中它仍然不是一个非常好的解决方案。

事情是:你已经提到了重要的关键概念:状态,如状态机

你真的想在这里使用多态:

abstract class Reason() {
   String getMessage() { // just to show that there might be some shared code
   abstract void doSomething();

那么你的Reason类会有不同的子类;最后,您的客户端代码归结为:

getReason().doSomething();

因为每个理由都知道自己要做什么!当然,这可能需要进一步思考 - 取决于这些不同的错误原因究竟是什么。

关键是:你真的想避免任何切换枚举或字符串值。如果有的话,你在工厂里隐藏这样的开关,返回一些抽象的类/接口东西(工厂为你创建一个具体的子类/实现)。