Это вопрос предпочтения безопасности/инкапсуляции, самая простая инкапсуляция - это первый подход, который вы опубликовали, второй, однако, является более совершенным способом инкапсуляции. Это защищает также объекты, передаваемые классу путем клонирования.
Рассмотрим следующий пример:
public class SomeData {
private final Point value;
public SomeData (final Point value) {
this.value = value;
}
public Point getValue() {
return value;
}
}
теперь выше фрагмент выглядит неизменны (аналогично вашему примеру) Однако есть зияющая дыра в этом. ознакомьтесь с приведенным ниже фрагментом.
public final static void main(final String[] args) {
Point position = new Point(25, 3);
SomeData data = new SomeData(position);
position.x = 22;
System.out.println(data.getValue());
}
Поскольку мы передаем только ссылку на переменную позиции, мы все еще можем изменить ее состояние.Клонирование это поможет защитить переменные позиции:
если мы изменим декларацию от этого:
public SomeData (final Point value) {
this.value = value;
}
к (похожей на ваше клонирование)
public SomeBetterData(final Point value) {
this.value = new Point(value);
}
, когда мы снова вызвать основной метод :
Point position = new Point(25, 3);
SomeData data = new SomeData(position);
position.x = 22;
data
объект останется неизменным независимо от того, что мы делаем с position
. Надеюсь, вы поняли, почему там клонирование.
Первый более условный. – vikingsteve
обычный, но не обязательно лучше. рассмотрите мое сообщение ниже :) – mel3kings