Вопрос
В Java, в соответствии со стандартным стилем кода и принципами проектирования, когда уместнее модифицировать внутренние данные объекта и когда уместнее создавать новый объект с использованием измененных данных?
Например, допустим, у меня есть некоторый класс Vector2D, который содержит компонент x и компонент yy, и я хочу повернуть этот вектор:
Подход A
public class Vector2D{
private int x;
private int y;
public Vector2D(int x, int y){
this.x = x;
this.y = y;
}
public void rotate(double angle){
//code for finding rotated vector
x = rotated_x;
y = rotated_y;
}
}
Затем объект Vector2D можно вращать с vector1.rotate(angle)
Подход B
public class Vector2D{
private final int x;
private final int y;
public Vector2D(int x, int y){
this.x = x;
this.y = y;
}
public Vector2D rotate(double angle){
//code for finding rotated vector
Vector2D rotated = new Vector2D(rotated_x, rotated_y);
return(rotated);
}
}
Затем объект Vector2D можно вращать с vector1 = vector1.rotate(angle)
Результаты такfar
Мое исследование этой проблемы до сих пор привело меня к убеждению, что подход B полезен для обеспечения возможности цепочки методов, например, vector1 = vector1.rotate(angle).scale(scalar)
, который имеет свои преимущества, больше с точки зрения читаемости вещей.
Это также привело меня к осознанию того, что подход B позволяет вам сделать объект неизменным, поэтому я полагаю, что в качестве расширения я также задаю вопрос:
Когда уместно сделать объектНеизменен, особенно в этом случае?(и вообще для точек, векторов, многоугольников и т. д. Должны ли все эти типы быть неизменными?)
Редактировать:
Проект, который я задумал при создании этого поста, - игра,в котором сущности представлены полигонами и управляются с помощью векторов.
Я считаю, что из-за предполагаемого применения обеспечение того, что классы являются потокобезопасными, не должно быть проблемой, так как данные вектора и полигона должны только когда-либов любом случае изменяться логическим потоком.
Это также означает, что эти операции потенциально могут выполняться 60 раз в секунду (каждый такт игры) для каждой отдельной сущности.Означает ли это, что любые накладные расходы от создания новых объектов каждый раз могут быстро накапливаться?