所以,让我试着了解你想要什么(就像我为我的客户做的一样)
您有一个带有价格字段的杂货类:
class Groceries {
private int price;
public Groceries(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public String toString() {
return "Groceries{" +
"price=" + price +
'}';
}
}
以及将 int money 归档和购物袋字段作为杂货清单的班级人员:
class Person {
private List<Groceries> shoppingBag = new ArrayList<>();
private int money;
public Person(int money) {
this.money = money;
}
public List<Groceries> getShoppingBag() {
return shoppingBag;
}
public int getMoney() {
return money;
}
}
首先你用一些钱创建一个Person的实例:Person person = new Person(150);
然后每次你在购物袋中添加杂货时,比如person.getShoppingBag().add(new Groceries(10));,你确实想减少来自person实例的钱。
所以,如果我是正确的,你需要实现几件事:
1)您应该禁止使用前面描述的方式将杂货添加到购物袋中。当有人试图通过 getter 向 List 添加元素时,我们需要抛出异常。它可以使用列表的不可修改副本来实现:
public List<Groceries> getShoppingBag() {
List<Groceries> bag = new UnmodifiableArrayList<>(shoppingBag.toArray(new Groceries[shoppingBag.size()]), shoppingBag.size());
return bag;
}
或者稍微好一点地使用番石榴:
public List<Groceries> getShoppingBag() {
List<Groceries> bag = ImmutableList.copyOf(shoppingBag);
return bag;
}
2) 添加一个直接添加杂货的方法。如果没有足够的钱没有负余额,你也可以抛出异常:
public void addToShoppingBag(Groceries groceries) {
if (0 > money - groceries.getPrice()) {
throw new IllegalStateException("You have not enough money!");
}
shoppingBag.add(groceries);
money -= groceries.getPrice();
}
3) 可能你需要有可能添加一些钱:
private void addMoney(int amout) {
money += amout;
}
请查看完整的演示示例:
class Demo {
public static void main(String[] args) throws IOException {
Person person = new Person(42);
try {
System.out.println(person.getMoney());
person.addToShoppingBag(new Groceries(12));
person.addToShoppingBag(new Groceries(20));
person.addToShoppingBag(new Groceries(5));
System.out.println(person.getMoney());
System.out.println(person.getShoppingBag());
person.getShoppingBag().add(new Groceries(1));
} catch (UnsupportedOperationException e) {
e.printStackTrace();
}
try {
person.addToShoppingBag(new Groceries(66));
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
class Person {
private List<Groceries> shoppingBag = new ArrayList<>();
private int money;
public Person(int money) {
this.money = money;
}
public List<Groceries> getShoppingBag() {
List<Groceries> bag = ImmutableList.copyOf(shoppingBag);
return bag;
}
public void addToShoppingBag(Groceries groceries) {
if (0 > money - groceries.getPrice()) {
throw new IllegalStateException("You have not enough money!");
}
shoppingBag.add(groceries);
money -= groceries.getPrice();
}
private void addMoney(int amout) {
money += amout;
}
public int getMoney() {
return money;
}
}
class Groceries {
private int price;
public Groceries(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public String toString() {
return "Groceries{" +
"price=" + price +
'}';
}
}
PS:下次请描述一些代码示例和演示以获得答案:)