这个java代码是否正确封装?我觉得如果我省略一些方法可以简单得多,但我们需要对每个方法都要求。
这是第一堂课:
public class Book
{
private String title;
private double price;
private final double SALES_TAX=0.075;
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title=title;
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price=price;
}
public double getSalesTax()
{
return SALES_TAX;
}
public double increasePrice(double incresePrice)
{
return incresePrice;
}
public double calculateSales(double sales)
{
return sales;
}
}
第二节课:
public class BookDriver
{
public static void main(String[] args)
{
Scanner keyboard=new Scanner(System.in);
Book bookOne=new Book();
Book bookTwo=new Book();
bookOne.setTitle("Life of Pi");
System.out.print("Enter number to buy of "+bookOne.getTitle()+": ");
bookOne.setPrice(13.50*bookOne.calculateSales(keyboard.nextDouble()));
bookOne.setPrice((bookOne.getPrice()*bookOne.getSalesTax())+bookOne.getPrice());
System.out.print("Cost for "+bookOne.getTitle()+" $");
System.out.printf("%.2f"+"\n",bookOne.getPrice());
bookTwo.setTitle("Harry Potter: The Goblet Of Fire");
System.out.print("Enter number to buy of "+bookTwo.getTitle()+": ");
bookTwo.setPrice(22.00*bookTwo.calculateSales(keyboard.nextDouble()));
bookTwo.setPrice((bookTwo.getPrice()*bookTwo.getSalesTax())+bookTwo.getPrice());
System.out.print("Cost for "+bookTwo.getTitle()+" $");
System.out.printf("%.2f"+"\n",bookTwo.getPrice());
System.out.print("Enter percent increase of "+bookOne.getTitle()+": ");
bookOne.setPrice((bookOne.getPrice()*bookOne.increasePrice(keyboard.nextDouble()))+bookOne.getPrice());
System.out.printf("Cost of "+bookOne.getTitle()+": $"+"%.2f"+"\n",bookOne.getPrice());
System.out.print("Enter percent increase of "+bookTwo.getTitle()+": ");
bookTwo.setPrice((bookTwo.getPrice()*bookTwo.increasePrice(keyboard.nextDouble()))+bookTwo.getPrice());
System.out.printf("Cost of "+bookTwo.getTitle()+": $"+"%.2f"+"\n",bookTwo.getPrice());
keyboard.close();
}
}
我知道这很多,所以我对答案的期望并不高,但任何事情都会有所帮助。谢谢!
答案 0 :(得分:1)
你不一定需要所有的安装者。例如,可能有理由认为一本书有一个标题,并且它没有改变。因此,您可以将其设置为final,省略setter,并将其传递给构造函数。
另外,想想你是如何建模的。销售税是一本书的财产吗?我不会说。
答案 1 :(得分:1)
最后两种方法没有多大意义。你只需返回你输入的内容。这样做:
public double increasePrice(double increase)
{
price *= increase;
}
public double calculateSales(double sales)
{
//return {your formula}
}
答案 2 :(得分:1)
让我们看看封装的重点。您有一个由属性和方法组成的类。封装背后的想法是,您希望类中的方法是更改属性值(状态)的唯一方法。可以这样想:如果程序中的某些其他代码想要更改其中一个属性的值,它就不能自己做,它必须在它们所在的类上询问一个方法来执行它。这样,您就可以控制对属性的访问。
实现它的方法是使用getter和setter方法创建一些方法。 getter方法返回属性的值,setter方法将其更改为新值。
<强> 1 强>
你的getter和setter方法最多可以增加Price()。您正在阻止访问除类中方法之外的属性。
<强> 2 强>
increasePrice()仅吐出传入的内容。它不会改变任何属性的值,因此没有任何意义。如果您希望能够提高价格,可以改变方法:
public void increasePrice(double amountOfPriceIncrease) {
price += amountOfPriceIncrease;
/*
price += amountOfPriceIncrease is the same as
price = price + amountOfPriceIncrease
*/
}
第3 强> 这条线有点令人不安。对于初学者来说,increasePrice()除了吐出内容之外什么都不做;其次,在一行中发生了很多事情,这使得它变得复杂且难以理解。
bookTwo.setPrice((bookTwo.getPrice()*bookTwo.increasePrice(keyboard.nextDouble()))+bookTwo.getPrice());
答案 3 :(得分:1)
因为类title, price
的所有必需变量Book
都设置为私有,并且该访问只能使用get..()
,并且只有在可能的情况下才能使用{ {1}}或影响其中一个字段的实例方法,它会演示正确的封装,因此所有获取和设置都受到监管。
但是,我在set..(some variable)
中发现了一些错误,即BookDriver
字段的使用不当。
Book
只能通过price
或setPrice
进行更改。
您还应该实施increasePrice
来确定图书的税后价格。
您购买的图书的总费用不应包含任何getPriceAfterTax
。
setPrice
出错。除了public double calculateSales(double sales)
之外,它什么都不做。 sales
应该使用一个int变量来计算所购买图书的总成本,并且还要求更改这些图书的价格,这不应该发生。这就是你编写凌乱代码的原因,如摘录
calculateSales
这避免了将bookTwo.setPrice(22.00*bookTwo.calculateSales(keyboard.nextDouble()));
bookTwo.setPrice((bookTwo.getPrice()*bookTwo.getSalesTax())+bookTwo.getPrice());
对象的值更改为意外或异常值和值组合的潜在情况。
此外,BOOK
可以改为SALES_TAX
,因为它假设永远不会改变,您只需获取public static final double
而无需SALE_TAX
。