【问题标题】:Is it a good practice to throw Exception inside setters in Java? [closed]在 Java 的 setter 中抛出异常是一个好习惯吗? [关闭]
【发布时间】:2016-05-07 19:00:24
【问题描述】:

更具体地说,我想编写一个代码,如果给定值为负,则抛出 IllegalArgumentException。我应该将此代码包含在 setter/constructor 中还是应该在调用适当的方法时检查该值? (例如:start()、init()、print() 或 run()。随便。)

我的代码(简化):

public class LLUAlgorithm {

private int temperature;

public int getTemperature() {
    return temperature;
}

public void setTemperature(int temperature) {
    if (temperature < 0)
        throw new IllegalArgumentException("can't be smaller than 0.")
    this.temperature = temperature;
}

public void run() {
    ...
}   

我不记得有一个 setter 像上面那样抛出异常的情况。但我很好奇它是好还是坏。

【问题讨论】:

  • 嗯,异常名称包含非法参数,所以当然你可以抛出它,当参数非法时,比如一个负数。是的,这可能发生在二传手中,我从来没有听说过,这是不好的做法(因为它不是)。
  • 是的,没关系,你甚至可以尝试更具体的例外...如果为空,如果是无效索引或定义自定义异常
  • 你应该抛出 IllegalArgumentException。您可以使用构建器模式过度使用它。你读过“Effective Java”这本书吗,里面有关于构建器模式的资料。
  • 是的,在setter中抛出异常。如果您的代码在稍后的某个时间点抛出IllegalArgumentException,那么调用者会感到困惑。来自the docs:Thrown to indicate that a method has been passed an illegal or inappropriate argument.
  • 我认为将异常放入设置器中是很好的,这样无论模型使用了多少次,模型本身都能够谈论错误。每次使用它时也会减少异常处理量。此外,如果您可以考虑公开 API,那听起来也足以在 setter 中放置异常

标签: java oop setter getter getter-setter


【解决方案1】:

最好的方法是让你的对象不可变,摆脱你的设置器并在构造函数中抛出你的异常,否则无论你选择哪种方式,如果发生错误,你有很高的风险使您的对象处于不一致的状态,这将导致很难找到错误。为了更好地理解,请阅读this,尤其是与Failure Atomicity相关的部分。

【讨论】:

  • 所以我明白了。如果我在我的情况下删除 setter 并将异常放入构造函数中,那么甚至不会创建对象。否则,对象将处于损坏状态。非常感谢您的回答和链接。
猜你喜欢
  • 2012-08-22
  • 2015-05-22
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多