首页 > 解决方案 > setter 方法是否公开属性?

问题描述

假设在一个简单的购物应用程序中有一个 Customer 类、Seller 类和 Trade 类,代码看起来很简单(为了说明我的问题):

 public class HelloWord {

    public static void main(String[] args) {

        Customer customer = new Customer();
        Seller seller = new Seller();

        Trade trade = new Trade(customer,seller);
        trade.buy(2);
    }

}

class Customer {
    private ArrayList<String> itemCart = new ArrayList<String>();
    private int gold = 100;

    public void setGold(int amount) {
        if (gold - amount >= 0) {
            gold -= amount;
        }
    }

    public int getGold() {
        return gold;
    }

    public void add(String item) {
        itemCart.add(item);
    }
}

class Seller {
    private ArrayList<String> itemCart = new ArrayList<String>();
    private ArrayList<Integer> itemsPrice = new ArrayList<Integer>();

    public int getItemPrice(int itemID) {
        return itemsPrice.get(itemID);
    }

    public String getItemById(int itemID) {
        return itemCart.get(itemID);
    }
}

class Trade {
    private Customer customer;
    private Seller seller;

    public Trade(Customer customer, Seller seller) {
        this.customer = customer;
        this.seller = seller;
    }

    public void buy(int itemID) {
        if (seller.getItemPrice(itemID) <= customer.getGold()) {
            customer.add(seller.getItemById(itemID));
            customer.setGold(seller.getItemPrice(itemID));
        } else {
            System.out.println("You don't have enough money to buy this item");
        }
    }
}

我的问题是““setGold”和“add”方法是否公开了属性?我不希望用户能够通过自己调用 add 方法或 setGold 来修改 itemCart 和黄金属性,但我希望能够访问它们以使用其他方法修改属性,在这种情况下来自 Trade 类中的“buy”方法。

换句话说,我的问题是:“我是否应该担心这些方法是否可以从主要方法访问,或者这是正常的并且不违反数据完整性?”

标签: javaoop

解决方案


Short ans no,因为itemCartis private,运行时调用者不能直接访问它。

长答案https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html


推荐阅读