错误的设计决策会引发访问器的异常?

2019年8月5日 4点热度 0条评论

我已经阅读了一些关于在访问器内引发异常的利弊的答案,但我想我将举一个例子来探讨我的具体问题:

public class App {
  static class Test {       
    private List<String> strings;

    public Test() {
    }

    public List<String> getStrings() throws Exception {
        if (this.strings == null)
            throw new Exception();

        return strings;
    }

    public void setStrings(List<String> strings) {
        this.strings = strings;
    }
}

public static void main(String[] args) {
    Test t = new Test();

    List<String> s = null;
    try {
        s = t.getStrings();
    } catch (Exception e) {
        // TODO: do something more specific
    }
  }
}

尚未设置
getStrings()时,
Exception将引发
strings。用一种方法可以更好地处理这种情况吗?

解决方案如下:

是的,那很糟糕。我建议在声明中初始化字符串变量,例如:

private List<String> strings = new ArrayList<String>();

你可以用类似的东西代替二传手

public void addToList(String s) {
     strings.add(s);
}

因此,没有NPE的可能性。

(或者,不要在声明中初始化字符串变量,不将初始化添加到addToList方法,并让使用它的代码检查getStrings()以查看是否返回null。)

至于为什么不好,用这样一个人为的例子很难说,但是似乎状态改变太多了,您通过让用户处理异常来惩罚此类的用户。还有一个问题,一旦程序中的方法开始引发Exception,那么该趋势将遍及整个代码库。

检查此实例成员是否已填充需要在某个地方完成,但是我认为应该在比此类更了解所发生情况的地方进行。