Как указывает naikus, аргумент fields
в конструкторе может быть изменен вне класса.Это также может быть «нестандартная» реализация List
.Таким образом,
this.fields = fields;
следует изменить на
this.fields = new ArrayList<Field>(fields);
или, возможно,
this.fields = Collections.unmodifiableList(new ArrayList<Field>(fields));
Есть плюсы и минусы в том, чтобы сделать поле неизменяемым списком.Прежде всего, это говорит о том, что вы имеете в виду.Это предотвращает ошибки / техническое обслуживание инженеров.Распределение немного удачно - вы не распределяете при каждом получении;ассигнования оптимизированы (возможен дополнительный анализ);располагать объекты вокруг не очень хорошая идея, потому что это замедляет сборку мусора (и в гораздо меньшей степени потребляет память).
Также делайте все классы и поля - говорите, что вы имеете в виду, и есть некоторые тонкости,
Методы "Добавить" хороши.Посмотрите на BigInteger
, скажем (хотя игнорируйте некоторые его особенности!).
Немного противоречивая точка зрения состоит в том, что все это get
в этих методах доступа в неизменяемом классе шум.Удалите get
.
Создание конструктора private
и добавление статического метода создания с именем of
добавляет немного, но вам почти никогда не требуется «новый» объект.Также позволяет вывод типа, прежде чем мы получим оператор алмазов в настоящее время в JDK7.private
конструкторы также позволяют удалять копируемые изменяемые файлы при создании нового экземпляра в addField
и removeField
.
equals
, hashCode
и, возможно, toString
приятно иметь.Хотя в качестве API есть интерфейсы YAGNI и конструкции (концепция, а не ключевое слово Java).