在 Java 中的 setter 中抛出异常是一个好习惯吗?

Is it a good practice to throw Exception inside setters in Java?

更具体地说,我想编写一个代码,如果给定值为负,则抛出 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 抛出上述异常的案例。但我很好奇它是好是坏。

最好的方法是让你的对象不可变,去掉你的 setter 并在构造函数中抛出你的异常,否则无论你选择什么方式,如果出现错误,您的对象处于不一致状态的风险很高,这会导致很难找到错误。为了更好地理解,请阅读 this 尤其是与 Failure Atomicity.

相关的部分