From f7d950c2a0a5510c9470a3af85b1324c4634cf90 Mon Sep 17 00:00:00 2001 From: Svitlana Turych Date: Thu, 30 Apr 2026 13:50:43 +0300 Subject: [PATCH] done the task --- src/main/java/core/basesyntax/Car.java | 87 ++++++++++++++++++++--- src/main/java/core/basesyntax/Engine.java | 48 ++++++++++++- src/main/java/core/basesyntax/Wheel.java | 42 ++++++++++- 3 files changed, 164 insertions(+), 13 deletions(-) diff --git a/src/main/java/core/basesyntax/Car.java b/src/main/java/core/basesyntax/Car.java index a84872f46..b1bbbabad 100644 --- a/src/main/java/core/basesyntax/Car.java +++ b/src/main/java/core/basesyntax/Car.java @@ -1,17 +1,44 @@ package core.basesyntax; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; -/** - * Make this class immutable. See requirements in task description. - */ -public class Car { - private int year; - private String color; - private List wheels; - private Engine engine; +public final class Car implements Cloneable { + private final int year; + private final String color; + private final List wheels; + private final Engine engine; - //implement this class + public Car(int year, String color, List wheels, Engine engine) { + this.year = year; + this.color = color; + this.wheels = new ArrayList<>(); + for (Wheel wheel : wheels) { + this.wheels.add(wheel.clone()); + } + this.engine = engine == null ? null : engine.clone(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Car car = (Car) o; + return color.equals(car.color) + && year == car.year + && wheels.equals(car.wheels) + && engine.equals(car.engine); + } + + @Override + public int hashCode() { + return Objects.hash(year, color, wheels, engine); + } @Override public String toString() { @@ -22,4 +49,46 @@ public String toString() { + ", engine=" + engine + '}'; } + + public Car changeEngine(Engine newEngine) { + return new Car(this.year, this.color, getWheelsCopy(), newEngine); + } + + public Car changeColor(String newColor) { + return new Car(this.year, newColor, getWheelsCopy(), getEngine()); + } + + public Car addWheel(Wheel newWheel) { + List updatedWheels = new ArrayList<>(wheels); + updatedWheels.add(newWheel); + return new Car(this.year, this.color, updatedWheels, this.engine); + } + + public int getYear() { + return year; + } + + public String getColor() { + return color; + } + + public List getWheels() { + List wheelsCopy = new ArrayList<>(wheels.size()); + for (Wheel wheel : wheels) { + wheelsCopy.add(wheel.clone()); + } + return wheelsCopy; + } + + public Engine getEngine() { + return engine == null ? null : engine.clone(); + } + + public List getWheelsCopy() { + List wheelsCopy = new ArrayList<>(wheels.size()); + for (Wheel wheel : wheels) { + wheelsCopy.add(wheel.clone()); + } + return wheelsCopy; + } } diff --git a/src/main/java/core/basesyntax/Engine.java b/src/main/java/core/basesyntax/Engine.java index a26a75c5f..36308087e 100644 --- a/src/main/java/core/basesyntax/Engine.java +++ b/src/main/java/core/basesyntax/Engine.java @@ -1,10 +1,33 @@ package core.basesyntax; -public class Engine { +import java.util.Objects; + +public class Engine implements Cloneable { private int horsePower; private String manufacturer; - //implement this class + public Engine(int horsePower, String manufacturer) { + this.horsePower = horsePower; + this.manufacturer = manufacturer; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Engine engine = (Engine) o; + return horsePower == engine.horsePower + && manufacturer.equals(engine.manufacturer); + } + + @Override + public int hashCode() { + return Objects.hash(horsePower, manufacturer); + } @Override public String toString() { @@ -13,4 +36,25 @@ public String toString() { + ", manufacturer='" + manufacturer + '\'' + '}'; } + + public int getHorsePower() { + return horsePower; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setHorsePower(int horsePower) { + this.horsePower = horsePower; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + + @Override + public Engine clone() { + return new Engine(horsePower, manufacturer); + } } diff --git a/src/main/java/core/basesyntax/Wheel.java b/src/main/java/core/basesyntax/Wheel.java index a09d6cd9e..6c8273e6a 100644 --- a/src/main/java/core/basesyntax/Wheel.java +++ b/src/main/java/core/basesyntax/Wheel.java @@ -1,9 +1,30 @@ package core.basesyntax; -public class Wheel { +import java.util.Objects; + +public class Wheel implements Cloneable { private int radius; - //implement this class + public Wheel(int radius) { + this.radius = radius; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Wheel wheel = (Wheel) o; + return radius == wheel.radius; + } + + @Override + public int hashCode() { + return Objects.hash(radius); + } @Override public String toString() { @@ -11,4 +32,21 @@ public String toString() { + "radius=" + radius + '}'; } + + public int getRadius() { + return radius; + } + + public void setRadius(int radius) { + this.radius = radius; + } + + @Override + public Wheel clone() { + try { + return (Wheel) super.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException("Can`t clone Wheel object", e); + } + } }