我创建了两个类,当我输入负数和负价时,它不会设置为" 0"和" 0.0"

时间:2017-07-05 11:50:46

标签: java invoice

我创建了两个类,当我输入负数和负价时,它没有设置为" 0"和" 0.0"分别为我在 setitmprch(int itmprch) setitmprch(int itmprch)方法中指定条件。请告诉我哪里犯了错误。

public class INVOICE {
private String pn;
private String pdscp;
private int itmprch;
private double prpitm;
private double amount;


public INVOICE(String pn, String pdscp, int itmprch, double prpitm ){
    this.pn=pn;
    this.pdscp=pdscp;
    this.itmprch=itmprch;
    this.prpitm=prpitm;

}

public void setpn(String pn){
    this.pn=pn;
}
public void setpdscp(String pdscp){
    this.pdscp=pdscp;
   }

public void setitmprch(int itmprch){
    if (itmprch < 0)
        itmprch=0;
}
public void setprpitm(double prpitm){
   if(prpitm > 0.0)
       this.prpitm=prpitm;
   else if(prpitm < 0.0)
       this.prpitm=0.0;
}

public String getpn(){
return pn;
}

public String getpdscp(){
return pdscp;
}
public int getitmprch(){
return itmprch;
}
public double getprpitm(){
return prpitm;
}
public double getInvoiceAmount(){
amount= getitmprch()*getprpitm();
return amount; 
}
}

   public class INVOICETEST {


public static void main(String[] args) {
    // TODO code application logic here
INVOICE in= new INVOICE("Mercedez","Arw 777",-3,-2.0);

System.out.printf("Part number is: %s\n",in.getpn());
System.out.printf("Part decription is: %s\n", in.getpdscp());    
System.out.printf("Item purchased: %s\n",in.getitmprch());
System.out.printf("Price per item is: %s\n",in.getprpitm());
System.out.printf("Total amount is: %s\n",in.getInvoiceAmount());


}

}

2 个答案:

答案 0 :(得分:3)

您正在为方法参数指定值,一旦退出方法,这些值就会丢失。将this.itmprch = itmprch添加到您的setitmprch方法中。另请参阅一些Java编程指南以提高代码可读性。

public void setitmprch(int itmprch){
    if (itmprch < 0)
        itmprch=0;
    this.itmprch = itmprch;
}

您的构造函数也应该调用setter方法而不是直接赋值。它看起来像这样:

public INVOICE(String pn, String pdscp, int itmprch, double prpitm ){
    setpn(pn);
    setpdscp(pdscp);
    setitmprch(itmprch);
    setprpitm(prpitm);
}

答案 1 :(得分:0)

请勿对课程名称使用全部大写字母。

使用更具描述性的变量名称 - 我的眼睛正在流泪看着它,理解它需要的时间比它应该长10倍。

使用自动属性而不是使用私有支持字段和void方法来设置/获取。

使用属性进行简单计算,例如计算发票金额。

不要设置私有变量然后返回所述变量。

使用单元测试来测试逻辑而不是主方法。当代码增长时会发生什么,如何使用一个入口点来测试它?

不要将in等受保护关键字用于变量名称(在主函数中)。

以下代码在C#中,但它应该可以轻松转录为Java。对Java的单元测试框架进行一些研究,并尝试将其整合到您的工作流程中。

public class Invoice
{
    public string ModelName { get; set; }
    public double Price { get; set; }
    public double Amount { get; set; }
    public double InvoiceAmount => Price * Amount;
}

[TestClass]
public class InvoiceTest
{
    [TestMethod]
    public void TestInvoiceAmount()
    {
        // Arrange
        var testInvoice = new Invoice()
        {
            ModelName = "Audi R8",
            Price = 5000.0,
            Amount = 1
        };

        // Act
        double invoiceAmount = testInvoice.InvoiceAmount;

        // Assert
        Assert.IsTrue(invoiceAmount == 5000.0);
    }
}