这是java的正确封装吗?我很困惑

时间:2015-09-17 23:36:39

标签: java encapsulation

这个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();
}

}

我知道这很多,所以我对答案的期望并不高,但任何事情都会有所帮助。谢谢!

4 个答案:

答案 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只能通过pricesetPrice进行更改。 您还应该实施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