如何在 Java 的构造函数中为变量设置条件值?

How to set a condition value for a variable in the constructor in Java?

我正在尝试为变量价格创建一个不小于 0 的条件,以便使用构造函数有效

这是我的代码

public void setPrice(){ 

if(price > 0){

    System.out.println("Valid value");}
else{

    System.out.println("Error");} }

除了 if 语句之外,还有其他方法吗?

I want to make sure that the value of price cant be less than 0 [...].

Is there a different way to do it other than if statement?

没有

但是,您所做的只是打印一条错误消息并继续使用无效值。那没有达到你的要求。

这是我认为你应该做的:

public void setPrice(int price){ 
    if (price <= 0) {
        throw new IllegalArgumentException("price not > 0");
    } 
    // set the price
}

如果price值无效,则抛出异常并“中断”正常的流程控制。您可以在(例如)调用此方法的方法中捕获并处理异常。根据使用代码的位置,异常处理程序可能会要求用户提供正确的值、拒绝当前请求、跳过输入文件中的“记录”等。但是这样做的逻辑......甚至报告问题的逻辑都不是 setPrice 方法的关注点。该方法只负责检查和设置价格

或者,您可以让应用程序终止。这就是这里会发生的事情。 IllegalArgumentException 是一个未经检查的异常,这意味着编译器不会坚持要求您对其进行处理。

您可以在构造函数中做同样的事情。但请注意,如果构造函数因异常而终止,则它创建的对象将不会完全初始化。一般都是扔掉的。


@Jay Anderson 建议使用 assert。这是一个可能的解决方案,但在这里可能不合适。问题是可以通过命令行选项关闭对 assert 断言的检查。 (事实上​​,断言检查默认是“关闭”的)

  • 您不希望人们能够关闭对用户提供的值的检查。

  • 您不希望人们能够关闭对其他人软件提供的值的检查。

  • 您不希望人们能够关闭对系统其他部分提供的值的检查。

真的,断言只有在您确定它在生产中 运行 没有执行检查的情况下是正确的......根本没有。我的建议是根本不要使用它们。而是使用(单独的)单元测试来找出代码中的问题。

下面是您定义的构造函数的一些伪代码。

public nameOfClass(type param){

if(param > 0){
throw new IllegalArgumentException("Error parameter may not be lower than 0");
}


}

如果您不希望参数小于零,我相信这就是构造函数的工作方式

我也相信 if 语句几乎肯定是解决这个问题的最佳方法。

如果这是内部检查(例如,如果不是正价格,则此时是编程错误),您可以使用 assert。类似于:

assert price > 0 : "Price must be positive."

如果这是检查外部生成的输入,则异常是更好的选择:

if (price <= 0) { throw new IllegalArgumentException("Price must be positive"); }

这仍然使用if。这些类型的验证方法通常放在实用方法中。例如番石榴有 Preconditions:

Preconditions.checkArgument(price > 0, "Price must be positive");

最后是验证框架,您可以在其中设置对象并检查是否满足所有条件(示例:http://beanvalidation.org/