如何根据 Java 中的布尔值答案更改 set 方法中的值?

How can I change a value in a set method depending on a boolean's answer in Java?

我正在尝试根据商品是否为奢侈品更改增值税税率。

我试过在我的 set 方法中使用 if,但它只使用我给它的预设值。

private double vat = 0.08;

是我的预设值。我的获取和设置方法是:

public double getVat() {
    return this.vat;
}

public void setVat(double vat) {
    if(lux=true) {
    this.vat = 0.10;
    }
    
    else if(lux=false) {
    this.vat = vat;
    }
}

变量lux

private boolean lux;

此外,这是我的构造函数的样子:

public ProductTest(String pname, double price, boolean lux) {
    this.pname = pname;
    
    if(price>0) {
    this.price = price;
    }
    else {
    this.price = 0;
    }
    
    this.lux = lux; //If product type is luxury , =true ----- if product type is not luxury, =false
    
}

当我创建并反对 lux 变量并将其标记为 true 或 false 时,VAT 取值 0.08。

ProductTest p = new ProductTest("apple", 10, true);
System.out.println(p.getVat());

输出:0.08

ProductTest p = new ProductTest("apple", 10, false);
System.out.println(p.getVat());

输出:0.08

我该怎么做才能克服这个问题?谢谢。

您应该按如下方式编写 setVat 方法:

public void setPrice(double vat) {
        //Setting vat to 0.10 if it's a luxury product
        if (lux) {
            this.vat = 0.10;
        } else {
            //Setting the given vat if it's a consistent value
            if (vat > 0) {
                this.vat = vat;
            }
        }
    }

这将确保您的两个逻辑:

  • 如果该商品是奢侈品,则其增值税必须是 0.10,无论通过了什么
  • 如果 vat 是一个一致的正值,那么它可以分配给对象的字段。

在您的方法中,您应该通过简单地将 lux 放在 if 括号内来检查 lux 是否为真。不需要检查 lux 是否等于 true,一个布尔值已经代表了比较的结果。此外,正如其他人在评论中指出的那样,要执行比较,您需要使用 == 运算符,而不是 =,后者表示赋值。

此外,您应该按照我在上面向您展示的那样集中您的 vat 设置逻辑。在你的 setter 方法中,你只检查了产品是否是奢侈品,而没有确保给定的值是一致的。您应该在 setter 方法中包含这两种逻辑,以集中它并避免代码重复,并在构造函数中调用 setter 。首先,分配产品名称、价格和 lux 标志,然后通过调用 setVat 方法设置增值税值。

public class ProductTest {

    private String pname;
    private double price;
    private double vat = 0.08;
    private boolean lux;

    public ProductTest(String pname, double price, boolean lux) {
        this.pname = pname;
        //Alternatively you could also define a price setter with the following logic and invoke it
        this.price = price > 0 ? price : 0;
        this.lux = lux; //If product type is luxury , =true ----- if product type is not luxury, =false
        setVat(vat);
    }

    public double getVat() {
        return this.vet;
    }

    public void setVat(double vat) {
        if (lux) {
            this.vat = 0.10;
        } else {
            if (vat > 0) {
                this.vat = vat;
            }
        }
    }

    @Override
    public String toString() {
        return String.format("%s at %g with %g vat is%s luxury", pname, price, vat, lux ? "" : " not");
    }

    public static void main(String[] args) {
        ProductTest pt1 = new ProductTest("test1", 0.50, true);
        System.out.println(pt1);

        ProductTest pt2 = new ProductTest("test2", 0.05, false);
        System.out.println(pt2);
    }
}

您需要在构造函数中调用 setVat 以应用逻辑

public ProductTest(String pname, double price, boolean lux) {
    this.pname = pname;
    this.price = Math.max(0, price);
    this.lux = lux;
    setVat(vat);
}

public void setVat(double vat) {
    if (lux) {
        this.vat = 0.10;
    } else {
        this.vat = vat;
    }
}

使用三元运算符甚至可以更短

public void setVat(double vat) {
    this.vat = lux ? 0.10 : vat;
}

或者通过将逻辑放在 getVat

中来做不同的事情
public ProductTest(String pname, double price, boolean lux) {
    this.pname = pname;
    this.price = Math.max(0, price);
    this.lux = lux;
}

public double getVat() {
    return lux ? 0.10 : vat;
}

public void setVat(double vat) {
    this.vat = vat;
}