java - 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”方法。
换句话说,我的问题是:“我是否应该担心这些方法是否可以从主要方法访问,或者这是正常的并且不违反数据完整性?”
解决方案
Short ans no
,因为itemCart
is private
,运行时调用者不能直接访问它。
长答案https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。
推荐阅读
- java - org.openqa.selenium.support.ui.UnexpectedTagNameException:元素应该是“选择”但在选择下拉值时是“跨度”
- jboss - java.lang.LinkageError:使用 JBoss 客户端 jar 时违反加载程序约束
- javascript - 如何检查来自 Postgres BIGINT 的值是否大于 Number.MAX_SAFE_INTEGER?
- javascript - 如何从包含 JavaScript 的 Weebly 网站中删除粘性/固定标题?
- css - Vuetify - 悬停卡展开:其他卡未调整大小
- java - 对于 API >= 26,我应该使用 StartService 还是 StartForegroundService?
- ios - 为什么由 UITabBarController.viewDidLoad 中的代码添加的自定义按钮不响应选择器
- python-3.x - 在 ruamel.yaml 的列表元素中添加注释
- python-3.x - 当用户输入被python中的任意数量的空格和换行符分隔时,如何获取用户输入?
- json - 如何将在 AWS EC2 中运行的 MySQL 5.7 迁移到带有 MySql 8.0 的 RDS?