Можете ли вы изменить неизменный класс? - PullRequest
0 голосов
/ 11 ноября 2019

Это теоретический вопрос для практики.

Вопрос

Создать неизменный класс Car.

Создать несколько экземпляров автомобиля для заполнения. Arraylist<Car> внутри класса Garage.

Класс 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 ammount = 0;
        for(Car car : myGarage) {
            ammount = car.getprice() + ammount;
        }
        System.out.println("The total ammount is: " + ammount);
    }

    @Override
    public boolean changeOwner(String regestraion, String ow) {

        for(Car car : myGarage) {
            if(car.getRegistration().equals(regestraion)) {
                myGarage.remove(car);
                car = new Car(ow, "444","F-50",  4, 4000.99);
                myGarage.add(car);
                return true;
            }
        }
        return false;
    }
}

1 Ответ

0 голосов
/ 11 ноября 2019

В объектно-ориентированном и функциональном программировании неизменный объект (неизменяемый объект) - это объект, состояние которого нельзя изменить после его создания. Это в отличие от изменяемого объекта (изменяемого объекта), который можно изменить после его создания. В некоторых случаях объект считается неизменным, даже если некоторые внутренне используемые атрибуты изменяются, но состояние объекта кажется неизменным с внешней точки зрения. - 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

...