У меня есть класс, полный полезных функций. Создание экземпляра из него не имеет смыслового смысла, но я все же хочу назвать его методы. Каков наилучший способ справиться с этим? Статический класс? Аннотация?
Java: статический класс?
Ответ 1
Частный конструктор и статические методы для класса, помеченного как final.
Ответ 2
Согласно большой книге "Эффективная Java" :
Пункт 4: Обеспечить неинтуитивность с помощью частного конструктора
- Попытка принудительного применения неинвертируемости путем создания абстрактного класса не работает.
- Конструктор по умолчанию генерируется только в том случае, если класс не содержит явных конструкторов, поэтому класс можно сделать неинтегрируемым, включив частный конструктор:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Поскольку явный конструктор является закрытым, он недоступен вне класса. AssertionError не требуется строго, но он обеспечивает страховку, если конструктор случайно вызван из класса. Это гарантирует, что класс никогда не будет создан при любых обстоятельствах. Эта идиома слегка противоречит интуиции, поскольку конструктор предоставляется явно, так что он не может быть вызван. Поэтому целесообразно включить комментарий, как показано выше.
В качестве побочного эффекта эта идиома также препятствует подклассу класса. Все конструкторы должны вызывать конструктор суперкласса, явно или неявно, и подкласс не будет иметь доступного конструктора суперкласса для вызова.
Ответ 3
Похоже, у вас есть класс утилиты, похожий на java.lang.Math.
Подходом является конечный класс с частным конструктором и статическими методами.
Но остерегайтесь того, что это делает для проверки, я рекомендую прочитать эту статью
Статические методы - это смерть для тестирования
Ответ 4
Чтобы плавать вверх по течению, статические члены и классы не участвуют в OO и поэтому злы. Нет, не зло, но серьезно, я бы рекомендовал обычный класс с одноэлементным шаблоном для доступа. Таким образом, если вам необходимо переопределить поведение в любом случае по дороге, это не является серьезным переоборудованием. OO - ваш друг: -)
My $.02
Ответ 5
комментарий к аргументам "private constructor": давайте, разработчики не так глупы; но они ленивы. создать объект, затем вызвать статические методы? не произойдет.
не тратьте слишком много времени, чтобы убедиться, что ваш класс нельзя использовать неправильно. верьте своим коллегам. и всегда есть способ злоупотреблять своим классом независимо от того, как вы его защищаете. единственное, что нельзя использовать неправильно, - вещь, которая совершенно бесполезна.
Ответ 6
- Конечный класс и частный конструктор (хороший, но не существенный)
- Публичные статические методы
Ответ 7
Нет смысла объявлять класс как static
. Просто объявите его методы static
и вызовите их из имени класса как обычно, например Java Math class.
Кроме того, хотя это не является обязательным для того, чтобы сделать конструктор закрытым, это хорошая идея. Маркировка закрытого конструктора запрещает другим людям создавать экземпляры вашего класса, а затем вызывает статические методы из этих экземпляров. (Эти вызовы работают точно так же на Java, они просто вводят в заблуждение и ухудшают читаемость вашего кода.)