Java: статический класс? - PullRequest
       7

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

127 голосов
/ 04 декабря 2009

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

Ответы [ 7 ]

159 голосов
/ 04 декабря 2009

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

92 голосов
/ 04 декабря 2009

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

Пункт 4: принудительное использование неотъемлемой части с помощью частного конструктора

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

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

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

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

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

21 голосов
/ 04 декабря 2009

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

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

6 голосов
/ 04 декабря 2009

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

Мои $ .02

3 голосов
/ 04 декабря 2009

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

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

2 голосов
/ 04 декабря 2009
  • Финальный класс и частный конструктор (хорошо, но не обязательно)
  • Публичные статические методы
1 голос
/ 04 декабря 2009

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

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

...