此Java代码是否正确封装?我很困惑

问题描述 投票:1回答:4

此涉及Book类的Java代码是否使用正确的封装?我觉得如果省略一些方法可能会简单得多,但是我们需要其中的每个方法[特别是setter和getters]。

这是头等舱:

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

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

此涉及Book类的Java代码是否使用正确的封装?我觉得如果省略一些方法会容易得多,但是我们需要其中的每个方法[特别是setter和...

java encapsulation
4个回答
1
投票

让我们看一下封装点。您有一个包含属性和方法的类。封装背后的想法是,您希望类中的方法成为更改属性值(状态)的唯一方法。可以这样想:如果程序中的某些其他代码想要更改属性之一的值,则它本身不能执行此操作,它必须在其所驻留的类上请求一个方法来执行此操作。这样,您可以控制对属性的访问。


1
投票

您不一定需要所有的二传手。例如,假设一本书有标题,并且它没有变化,可能是合理的。因此,您可以将其定型,省略设置器,然后将其传递给构造函数。


1
投票

因为类title, price的所有必需变量Book都设置为private,并且该访问只能使用get..()使用,并且如果可能的话,只能通过set..(some variable)或影响其中一个字段,它演示proper encapsulation


1
投票

后两种方法没有多大意义。您只需返回您输入的内容即可。

public double increasePrice(double increase)
{
    price *= increase;
}
public double calculateSales(double sales)
{
    //return {your formula}
}
© www.soinside.com 2019 - 2024. All rights reserved.