В объектно-ориентированном и функциональном программировании неизменный объект (неизменяемый объект) - это объект, состояние которого нельзя изменить после его создания. Это в отличие от изменяемого объекта (изменяемого объекта), который можно изменить после его создания. В некоторых случаях объект считается неизменным, даже если некоторые внутренне используемые атрибуты изменяются, но состояние объекта кажется неизменным с внешней точки зрения. - WikiPedia
Таким образом, неизменяемые объекты - это экземпляры, состояние которых не изменяется после их инициализации. Эти типы классов, как правило, хороши для приложений, которым необходимо реализовать некоторую форму кэширования, и где вы беспокоитесь о безопасности потоков в многопоточной среде (неизменяемые объекты по своей природе потоково-безопасны).
Я не вижу ваш Car
класс, но при условии, что он будет выглядеть примерно так:
public final class Car {
final String registration;
final String owner;
public Car(String registration, String owner) {
this.registration = registration;
this.owner= owner;
}
public String getRegistration() {
return registration;
}
public String getOwner() {
return owner;
}
}
... обратите внимание, что в этом методе нет setter
класс. Следовательно, car
может быть только инициализирован (т. Е. Car myCar = new Car("abcd", "John");
, а переменные в них (а именно, registration
и owner
) никогда не могут быть обновлены.
Таким образом, ваш метод changeOwner
по сути является циклическимчерез экземпляры car
в вашем garage
и когда он находит соответствующий регистрационный номер, он удаляет этот экземпляр car
из вашего garage
, а затем добавляет совершенно новый.
Чтобы продемонстрировать это, вы можете выполнить следующее:
public class Garage {
public static void main(String ... args) {
List<Car> myGarage = new ArrayList<>();
myGarage.add(new Car("CG404GH", "John"));
System.out.println(myGarage);
for(Car car : myGarage) {
if("CG404GH".equals(car.getRegistration())) {
myGarage.remove(car);
Car updateCar = new Car("DD404GH", "John");
myGarage.add(updateCar);
}
}
System.out.println(myGarage);
}
}
Это выведет что-то похожее на следующее (часть после @ будет отличаться при каждом запуске):
[Car@4411d970]
[Car@6442b0a6]
ВажноеЗдесь следует отметить, что значения после @ различны, следовательно, это два совершенно разных класса (экземпляра) car