【发布时间】:2023-04-11 06:18:01
【问题描述】:
这是一个实践的理论问题。
问题是
创建一个不可变类
Car。创建一些汽车实例以在
Garage类中填充Arraylist<Car>。
MyGarage类从Garage实现这些方法:
getCar(String reg)– 搜索注册号为reg的汽车。getMake(String make)– 返回与给定make匹配的汽车列表。totalValue()– 计算列表中所有汽车的总价值。changeOwner(String reg, String ow)– 将注册号为reg的车主更改为ow。
我不理解changeOwner 方法,因为我认为它不能更改不可变类的实例???
这是我为解决它所做的工作,但看起来很愚蠢
import java.util.ArrayList;
public class MyGarage implements Garage {
private ArrayList<Car> myGarage;
public MyGarage() {
myGarage = new ArrayList<Car>();
}
@Override
//Adds a Car if the registration is unique
public boolean add(Car c) {
for(Car car : myGarage) {
if(car.getRegistration().equals(c.getRegistration())) {
System.out.println("Car has the same Registration as another illegal");
return false;
}
}
myGarage.add(new Car(c.getOwner(),c.getRegistration(),c.getMake(),c.getkilometres(), c.getprice()));
return true;
}
@Override
public Car getCar(String carID) {
for(Car car : myGarage) {
if(carID.equals(car.getRegistration())) {
System.out.println("Car Found");
return car;
}
}
System.out.println("No car of that record");
return null;
}
@Override
public ArrayList<Car> getMake(String make) {
ArrayList<Car> carModel = new ArrayList<Car>();
for(Car car : myGarage) {
if (car.getMake().equals(make)) {
carModel.add(car);
}
}
System.out.println(carModel.toString());
return carModel;
}
@Override
public void totalValue() {
double amount = 0;
for(Car car : myGarage) {
amount = car.getprice() + amount;
}
System.out.println("The total amount is: " + amount);
}
@Override
public boolean changeOwner(String registration, String ow) {
for(Car car : myGarage) {
if(car.getRegistration().equals(registration)) {
myGarage.remove(car);
car = new Car(ow, "444","F-50", 4, 4000.99);
myGarage.add(car);
return true;
}
}
return false;
}
}
【问题讨论】:
-
car = new Car(ow, "444","F-50", 4, 4000.99);-new表示 新 - 你没有改变现有的Car你正在构建一个新的。 -
myGarage.remove(car);- 这行得通吗? -
@ScaryWombat OP 说他们必须解决不变性问题。创建一个新的
Car是一种解决方法,但它并没有真正改变汽车的所有者——因此是个问题。 -
根据您给出的要求,汽车似乎不能有所有者财产。也许您打算将所有者信息存储在车库而不是汽车中。
-
不可变类通常会有返回一个克隆对象的设置器,其中相关字段已更新。在这种情况下,它隐藏在 Garage 类中,尽管我仍然会以这种方式实现它——不过,你不应该硬编码其他值;它们应该从正在更新的不可变实例中提取——并且克隆/等的责任不在于车库,而在于汽车。
标签: java oop arraylist immutability