The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Предполагается, что предварительная обработка аргументов конструкторов перед их инкапсуляцией является плохой практикой. Тем не менее, очень часто это необходимо делать именно так: выполнить некоторые манипуляции с объектами, предоставленными в качестве аргументов, а затем только присвоить их атрибутам созданного объекта. Для этой цели я предлагаю использовать предварительные конструкторы, которые могут быть методами или автономными объектами.
Допустим, это ваш код:
Единственный конструктор ожидает список заголовков, который инкапсулируется как this.titles
для последующего использования. Он также защищен от случайных изменений через декоратор JDK unmodifiableList
. Пока все хорошо. Теперь мы хотим сделать наш класс немного умнее и позволить ему принимать не только List
, но и массив строк:
Что не так с этим кодом? Те из вас, кто читал мои предыдущие blog посты об ООП, безусловно, знают ответ. Во-первых, здесь есть два основных конструктора, что является плохой практикой. Во-вторых, во втором конструкторе есть код, что также является плохой идеей.
Вот как я обычно рефакторю этот код, чтобы решить оба упомянутых проблемы:
Я называю этот новый статический метод toList()
преструктором: он используется только в момент конструирования объекта и только из вторичного конструктора.
Еще более лучшим способом было бы создать новый класс ToList
, который делал бы точно то же самое, но более декларативно и лениво:
ListOf
из Cactoos является прекрасным примером такого преобразователя.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:52