Java - неужели у плохой практики не есть конструктор класса?

Я хочу создать вспомогательный класс, который имеет дело с форматированием (т.е. имеет методы для удаления знаков препинания и преобразования между типами, а также для переформатирования имен и т.д.). Это не похоже, что ему понадобятся какие-либо поля - единственная его цель - получить переданные вещи для преобразования и возврата их, переформатированные. Неплохая практика - оставить конструктора? Если да, то что должен делать мой конструктор? Я смотрел эту ссылку и заметил, что в классе, который он описывает, отсутствует конструктор.

Ответ 1

Неплохо ли использовать конструктор?

Да - поскольку если вы не укажете каких-либо конструкторов, компилятор Java предоставит вам конструктор с той же видимостью, что и сам класс.

Предполагая, что все ваши методы статичны, что кажется вероятным, если вы не хотите полиморфизма, вы должны сделать свой класс final и дать ему конструктор private, чтобы другие разработчики случайно не создали экземпляр вашего класса, когда это было бы бессмысленно. Когда вы думаете об API, в любое время, когда я могу удалить способность разработчиков делать что-то глупое, я делаю так:)

Так что-то вроде:

public final class Helpers {
    private Helpers() {
    }

    public static String formatDate(Date date) {
        // etc
    }
}

Обратите внимание, что, выбирая полиморфизм из уравнения, вы также удаляете возможность изменить это поведение для тестов и т.д. Это может быть хорошо - я не верю в "никакой статики, когда-либо", но это стоит рассмотреть.

Ответ 2

Любой класс, который имеет все методы, которые не имеют или не нуждается в каком-либо состоянии, может уменьшить видимость конструктора, сделав его конструктивным.

Пример класс java.lang.Math в Java.

Поскольку java.lang.Math имеет все статические методы, которые выполняют аналогичную работу, как ваш класс, они объявили конструктор как private, так что никто не может случайно создать экземпляр этого класса.

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}

Ответ 3

Неплохая практика. но пример, который вы указали, не имеет каких-либо переменных-членов, которые могут использоваться в контексте объекта. В таких ситуациях лучше всего иметь статические методы, потому что тогда вам не нужно выделять память для создания объектов класса перед вызовом методов.

Ответ 4

Компилятор будет генерировать конструктор по умолчанию (без параметров) для вас. Если ваш класс не имеет состояния и не расширяет класс, который требует инициализации, вы можете разрешить его без объявления явного конструктора

Ответ 5

нет смысла оставлять конструктор, поскольку в вашем классе нет переменных экземпляра!

Конструкторы

предназначены для инициализации переменных экземпляра!

если вы пропустите конструктор, компилятор в любом случае вставляет конструктор по умолчанию, который достаточно справедлив!

Ответ 6

Обычно это хорошая практика кодирования для определения вашего конструктора в классе, хотя каждый класс имеет конструктор по умолчанию.

Но если у вас нет особой необходимости использовать конструктор с генератором или создать какой-либо одноэлементный шаблон, вы можете удалить конструктор.

Если вы используете статические методы в своем случае, вам также не нужно определять конструктор, так как вам не нужен объект этого класса.