Лабораторная работа №11
Название работы
Разработка класса-шаблона для создания объектов.
Пример реализации
Файл Box.java
:
/**
* Класс, обозначающий коробку
*/
public class Box {
// статическая неизменяемая переменная класса задает формат
// строки описания объекта (общая для всех объектов класса)
private final static String BOX_FORMAT_STRING =
"Box: длина: %.2f, ширина: %.2f, высота: %.2f";
/**
* Ширина коробки (поле)
*/
private double width;
/**
* Высота коробки (поле)
*/
private double height;
/**
* Глубина коробки (поле)
*/
private double depth;
/**
* Метод-конструктор, выполняет инициализацию класса
* @param width Ширина коробки
* @param height Высота коробки
* @param depth Глубина коробки
*/
public Box(double width, double height, double depth) {
this.depth = depth;
this.width = width;
this.height = height;
}
/**
* Копирующий конструктор
* Обратите внимание, что мы можем использовать
* наш класс как тип данных
* @param anotherBox
*/
public Box(Box anotherBox) {
// Box это ссылочный тип, проверяем, что нам передали
if(anotherBox == null) {
// Выбрасываем ошибку если втирают какую-то дичь
throw new IllegalArgumentException("anotherBox");
}
this.width = anotherBox.getWidth();
this.height = anotherBox.getHeight();
this.depth = anotherBox.getDepth();
}
/**
* Метод-геттер для получения
* значения глубины коробки
* @return глубина коробки
*/
public double getDepth() {
return depth;
}
/**
* Метод-геттер для получения
* значения ширины коробки
* @return ширина коробки
*/
public double getWidth() {
return width;
}
/**
* Метод-геттер для получения
* значения высоты коробки
* @return высота коробки
*/
public double getHeight() {
return height;
}
/**
* Метод для вычисления объема коробки
* @return объем коробки
*/
public double getVolume() {
return depth * width * height;
}
/**
* Сеттер для изменения глубины коробки
* @param depth глубина коробки
*/
public void setDepth(double depth) {
if (depth < 0) {
throw new IllegalArgumentException("depth");
}
this.depth = depth;
}
/**
* Сеттер для изменения ширины коробки
* @param width ширина коробки
*/
public void setWidth(double width) {
if (width < 0) {
throw new IllegalArgumentException("width");
}
this.width = width;
}
/**
* Сеттер для изменения высоты коробки
* @param height высоты коробки
*/
public void setHeight(double height) {
if (height < 0) {
throw new IllegalArgumentException("height");
}
this.height = height;
}
/**
* Реализация метода toString
* @return представление объекта в виде строки
*/
@Override
public String toString() {
return String.format(BOX_FORMAT_STRING, width, height, depth);
}
/**
* Реализация метода equals
* Он предназначен для проверки двух объектов на равенство
* Мы не можем использовать == для проверки равенства объектов,
* так как == сравнивает равенство ссылок
* Для реализация проверки равенства по значению нужен метод equals
* Но так как логика сравнения разных объектов зависит от того,
* Что это за объект и какой класс, в каждом классе нужно реализовать этот метод.
* Если вы хотите сравнивать объекты, само собой.
* Если вам это не надо - то и не реализовывайте, будто у вас без этого проблем мало.
* @param anotherBox другой объект класса Box
* @return true, если объекты равны, иначе false
*/
public boolean equals(Box anotherBox) {
// Если ссылки равны (== проверяет равенство ссылок)
// То anotherObject это этот же самый объект
if (this == anotherBox) return true;
// Если передали null-ссылку, то мы точно ей не равны
// А если вдруг равны - то вполне вероятно, что у вас проблемы
if (anotherBox == null) return false;
// А здесь мы сравниваем примитивные типы, можем юзать ==
// Коробки равны, если все стороны соответственно равны.
return this.depth == anotherBox.getDepth()
&& this.height == anotherBox.getHeight()
&& this.width == anotherBox.getWidth();
}
}
Файл Main.java
:
public class Main {
public static void main(String[] args) {
// Создаем объект
Box firstBox = new Box(3, 1, 5);
// Создаем вторую ссылку на первую коробку
Box alsoFirstBox = firstBox;
// firstBox и alsoFirstBox ссылаются на один объект
// создание копии объекта
// согласно заданию на ЛР использовать надо
// конструктор без параметров
// Но гораздо лучше использовать копирующий конструктор
Box secondBox = new Box (alsoFirstBox);
// cоздание объекта с другими значениями полей
Box completelyAnotherBox = new Box(4, 5, 7);
//Создание null-ссылки
Box nullBox = null;
//Вывод информации об объектах
System.out.println("firstBox=" + firstBox);
System.out.println("alsoFirstBox=" + alsoFirstBox);
System.out.println("secondBox=" + secondBox);
System.out.println("completelyAnotherBox=" + completelyAnotherBox);
System.out.println("nullBox=" + nullBox);
//Вывод результатов сравнения объектов
System.out.println("firstBox==alsoFirstBox: " + firstBox.equals(alsoFirstBox));
System.out.println("firstBox==secondBox: " + firstBox.equals(secondBox));
System.out.println("firstBox==completelyAnotherBox: " + firstBox.equals(completelyAnotherBox));
System.out.println("alsoFirstBox==secondBox: " + alsoFirstBox.equals(secondBox));
System.out.println("alsoFirstBox==completelyAnotherBox: " + alsoFirstBox.equals(completelyAnotherBox));
System.out.println("secondBox==completelyAnotherBox: " + secondBox.equals(completelyAnotherBox));
System.out.println("secondBox==nullBox: " + secondBox.equals(nullBox));
}
}