java-- Зачем копировать аргументы для неприкосновенности класса? - PullRequest
0 голосов
/ 03 июня 2018

Я сейчас видел это:

public ImmutableClass( final long id, final String[] arrayOfStrings,
final Collection< String > collectionOfString) {

this.id = id;
this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
this.collectionOfString = new ArrayList<>( collectionOfString );
}

Я никогда не видел ничего подобного раньше.Утверждалось, что это для «Иммунитет» класса, и это гарантирует, что состояние не может быть изменено извне.

Итак, имеет ли это смысл или что это?

Кроме того, я хотел знать, почему аргументы в этом коде помечены как окончательные?

1 Ответ

0 голосов
/ 03 июня 2018

Итак, имеет ли это смысл или что это?

Это создаст глубокую копию аргумента массива String.

arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );

Это скопируетвходной массив для внутренней переменной, которая эффективно предотвращает изменение поля ImmutableClass.arrayOfStrings путем изменения предоставленного массива.

Если вы просто назначите его следующим образом:

public ImmutableClass( final long id, final String[] input,
final Collection< String > collectionOfString) {

    this.id = id;
    this.arrayOfStrings = input;
...
}

Затем при изменении input: input[0] = "new string", внутренний arrayOfStrings тоже был изменен, что нарушает характеристику Immutable

Та же логика применяется к collectionOfString

Кроме того, я хотелчтобы знать, почему аргументы в этом коде помечены как окончательные?

Это предохранитель, предотвращающий переназначение переданного параметра другому значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...