Время для четвертой главы нашего эффективного обзора Java! Сегодня – быстрая и простая глава.
Сегодня мы говорим о классах полезности. Как указывает автор, эти классы часто могут восприниматься как анти-шаблон и способ обойти использование правильных объектов. При этом у них определенно есть свое предназначение в мире, особенно на Java. Итак, давайте рассмотрим некоторые места, где служебные классы могут быть полезны:
- Для группировки действий над примитивными объектами. ie
java.lang. Math
,java.util. Массивы
- Для группировки действий в классах, которыми вы не владеете. Это похоже на описанное выше, но в данном случае это относится к объекту, к изменению которого у вас может не быть доступа.
Local DateUtils – это то, что я видел раньше. Это то, что функции расширения
- могут решить гораздо более чистым способом на таких языках, как Kotlin.
Они также могут быть домом для заводских методов, таких как в
Итак, мы видим, что есть некоторые варианты использования, в которых это полезно, так как же нам это сделать? Что на самом деле сводится к тому, чтобы не забыть учесть, что он не может быть создан. Мы знаем, что даже если вы не включаете конструктор, Java добавит конструктор без аргументов по умолчанию.
Первый метод заключается в том, чтобы сделать класс абстрактным классом. Это действительно делает невозможным создание экземпляра класса напрямую, но на самом деле не выполняет то, что ему нужно. Рассуждения двоякие. Во-первых, пользователь класса может быть производным от этого абстрактного класса и создать экземпляр дочернего класса в этом случае. Другая проблема заключается в том, что абстрактный класс не сообщает о намерениях происходящего. Когда мы видим абстрактный класс, он в основном просит, чтобы его расширили.
Итак, каков другой вариант и тот, который предлагает Эффективная Java? Ну, вы, наверное, могли бы догадаться об этом но суть в том, чтобы создать частный конструктор без аргументов. И все просто: вы теряете свой общедоступный конструктор по умолчанию и получаете защищенный экземпляр вашего класса. Даже упоминается, что ваш частный конструктор без аргументов должен иметь только одну строку, которая выдает AssertionError
. Это выводит его на новый уровень, так что даже если один из статических методов попытается создать объект, он выдаст ошибку. Лично я обычно делаю это с помощью Lombok с @NoArgsConstructor(access. ЧАСТНЫЙ)
. Вы не понимаете AssertionError
выбрасывается, но это просто и дает нам то, что мы хотели.
Итак, как вы можете видеть, это довольно просто и прямолинейно. Если мы обнаружим, что создаем много служебных классов, это может быть признаком того, что мы начинаем склоняться к более процедурному программированию, и, возможно, есть лучший способ выполнить нашу задачу. Однако, если нам действительно нужен служебный класс, не забудьте запретить создание экземпляра вашего класса.
Оригинал: “https://dev.to/kylec32/effective-java-tuesday-utility-classes-4gbi”