Java: Статический Класс?


У меня есть класс полный полезных функций. Создание экземпляра этого экземпляра не имеет семантического смысла, но я все еще хочу вызвать его методы. Каков наилучший способ справиться с этим? Статический класс? Резюме?

7 125

7 ответов:

частный конструктор и статические методы для класса, помеченного как final.

согласно великой книге "Эффективная Java":

пункт 4: принудительная неинстантируемость с помощью частного конструктора

- попытка применить неинстантируемость путем создания абстрактного класса не работает.

- конструктор по умолчанию создается только в том случае, если класс не содержит явных конструкторов, поэтому класс можно сделать неинстантируемым, включив частный конструктор:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

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

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

похоже, у вас есть служебный класс, как java.ленг.Математика.
Подход есть окончательный класс с частным конструктором и статическими методами.

но остерегайтесь того, что это делает для тестируемости, я рекомендую прочитать эту статью
статические методы-это смерть для тестируемости

просто плыть по течению, статические члены и классы не участвуют в ОО и, следовательно, зло. Нет, не зло, но серьезно, я бы рекомендовал обычный класс с одноэлементным шаблоном для доступа. Таким образом, если вам нужно переопределить поведение в любом случае по дороге, это не является серьезным переоборудованием. ОО твой друг :-)

мои $.02

прокомментируйте аргументы "частного конструктора": да ладно, разработчики не настолько глупы; но они ленивы. создание объекта, а затем вызов статических методов? не случится.

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

  • окончательный класс и частный конструктор (хорошо, но не обязательно)
  • статические методы

нет смысла объявлять класс как static. Просто объявите его методы static и вызывайте их из имени класса как обычно, например Java мат класса.

кроме того, даже если это не является строго необходимым, чтобы сделать конструктор частным, это хорошая идея, чтобы сделать это. Пометка конструктора private не позволяет другим пользователям создавать экземпляры вашего класса, а затем вызывать статические методы из этих экземпляров. (Эти вызовы работают точно так же в Java, они просто вводят в заблуждение и навредить читабельности кода.)