在 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
.
相关的部分
更具体地说,我想编写一个代码,如果给定值为负,则抛出 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
.