在Java中,在setter内部抛出异常是一种好的做法吗?

在Java中,在setter内部抛出异常是一种好的做法吗?,java,oop,setter,getter,getter-setter,Java,Oop,Setter,Getter,Getter Setter,更具体地说,我想编写一个代码,如果给定值为负值,则抛出IllegalArgumentException。我应该在setter/constructor中包含此代码,还是应该在调用适当的方法时检查值?(例如:start(),init(),print()或run()等等。) 我的代码(简化): 公共类逻辑算法{ 温度; 公共int getTemperature(){ 返回温度; } 公共空隙设定温度(内部温度){ 如果(温度

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

我的代码(简化):

公共类逻辑算法{
温度;
公共int getTemperature(){
返回温度;
}
公共空隙设定温度(内部温度){
如果(温度<0)
抛出新的IllegalArgumentException(“不能小于0”)
这个温度=温度;
}
公开募捐{
...
}   

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

最好的方法是使对象不可变,去掉setter并将异常抛出构造函数中,否则无论您选择何种方式,一旦发生错误,您都有很高的风险抛出异常您的对象处于不一致的状态,这将导致难以找到错误。为了更好地理解,请特别阅读与
故障原子性相关的部分

好吧,异常名称包含非法参数,因此当参数非法时,您当然可以抛出它,如负数。是的,这可能发生在se中tter,我从来没有听说过,这是一种不好的做法(因为它不是)。是的,这是可以的,你甚至可以尝试更具体地处理异常…如果是null,如果是无效索引或定义自定义异常你应该抛出IllegalArgumentException。你可以用构建器模式过度处理。你读过《有效Java》一书吗,这有关于构建器模式的材料。是的,在setter中抛出异常。如果您的代码在稍后某个时间点抛出
IllegalArgumentException
,调用方会感到困惑。From:
抛出以指示某个方法传递了非法或不适当的参数。
我认为放置异常很好在setters中,让模型本身能够谈论错误,无论模型被使用了多少次。同时,每次使用时都要减少异常处理量。此外,如果你能想到公开API,这听起来也足够好,可以在setter中放入异常。我明白了。如果我在我的情况下删除setter,然后如果构造函数中没有异常,那么对象甚至不会被创建。否则,对象将处于断开状态。非常感谢您的回答和链接。
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() {
    ...
}