繁体   English   中英

复制代码以引发异常

[英]Duplicating code for throwing exceptions

可以说我有这段代码:

public class Car {
    private int fuel;

    public Car(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
    }

    public void setFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
   }

我的问题是,我能以某种方式避免在构造函数和setter中重复代码吗?

为什么不更改构造函数以调用setter:

public Car(int fuel) {
    setFuel(fuel);
}

直接从构造函数调用setter:

public class Car {
    private int fuel;

    public Car(int fuel) {
        setFuel(fuel);
    }

    public void setFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
   }

是。 从构造函数中调用setFuel(燃料)。

与大多数重复的代码一样,您可以将其分解为方法。

public class Car {
    private int fuel;

    public Car(int fuel) {
        checkFuel(fuel);
        this.fuel = fuel;
    }

    public void setFuel(int fuel) {
        checkFuel(fuel);
        this.fuel = fuel;
    }

    private static void checkFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("'fuel' argument can't be negative");
        }
    }

为什么不从构造函数调用setFuel 因为在完全初始化之前从构造函数内部调用实例的方法可能会导致错误。 考虑:子类重写setFuel并添加副作用。 有关此问题及其答案的更多信息。

这是另一种方式,也将其封装在方法中:

public class Car {
    private int fuel;

    public Car(int fuel) {
        this.privateSetFuel(fuel);
    }

    public void setFuel(int fuel) {
        this.privateSetFuel(fuel);
    }

    private void privateSetFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("'fuel' argument can't be negative");
        }
        this.fuel = fuel;
    }

旁注:请注意,我在异常消息中添加了参数名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM