У мене клас, повний корисних функцій. Ігнорувати його екземпляр не має смислового сенсу, але я все ж хочу назвати його методи. Який найкращий спосіб впоратися з цим? Статичний клас? Анотація?
У мене клас, повний корисних функцій. Ігнорувати його екземпляр не має смислового сенсу, але я все ж хочу назвати його методи. Який найкращий спосіб впоратися з цим? Статичний клас? Анотація?
Відповіді:
Приватний конструктор і статичні методи на класі, позначені як остаточні.
Згідно чудової книги "Ефективна Java" :
Пункт 4: Застосування нестійкості за допомогою приватного конструктора
- Спроба закріпити неіснуючість шляхом створення конспекту класу не працює.
- Конструктор за замовчуванням генерується лише в тому випадку, якщо клас не містить явних конструкторів, тому клас можна зробити невідчутним, включивши приватний конструктор:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Оскільки явний конструктор приватний, він недоступний поза класом. AssertionError не є строго необхідним, але він забезпечує страхування на випадок випадкового виклику конструктора з класу. Це гарантує, що клас ніколи не буде інстанційним при будь-яких обставинах. Ця ідіома є м'яко контртуалітичною, оскільки конструктор надається чітко, щоб його не можна було викликати. Тому розумно включити коментар, як показано вище.
Як побічний ефект, ця ідіома також запобігає підкласу класу. Усі конструктори повинні викликати конструктор надкласового класу, явно або неявно, і підклас не матиме доступного конструктора надкласового класу, на який можна викликати.
AssertionError
над іншої альтернативи , як IllegalStateException
, UnsupportedOperationException
і т.д.?
Схоже, у вас є клас корисності, схожий на java.lang.Math .
Підхід існує заключний клас з приватними конструкторськими та статичними методами.
Але будьте обережні, що це робить для перевірки, я рекомендую прочитати цю статтю
Статичні методи - це смерть для заповіту
Тільки щоб плавати вище за течією, статичні члени та класи не беруть участі в ОО і тому є злими. Ні, не зле, але серйозно, я б рекомендував для доступу звичайний клас з однотонним малюнком. Таким чином, якщо вам потрібно змінити поведінку в будь-яких випадках в дорозі, це не є основним переобладнанням. OO - ваш друг :-)
Мої $ 02
коментуйте аргументи "приватного конструктора": давай, розробники не такі дурні; але вони ледачі створюючи об'єкт, потім викликати статичні методи? не відбудеться
не витрачайте занадто багато часу, щоб переконатися, що ваш клас не можна зловживати. мати певну віру для своїх колег. і завжди є спосіб зловживати своїм класом незалежно від того, як ви його захищаєте. Єдине, чим не можна зловживати, - це річ, абсолютно марна.
Немає сенсу заявляти клас як static
. Просто оголосіть його методи static
та зателефонуйте їм із імені класу як звичайні, як клас Math Java .
Крім того, хоча це не обов'язково робити конструктор приватним, це гарна ідея. Позначення конструктора приватним заважає іншим створювати екземпляри вашого класу, а потім викликати статичні методи з цих екземплярів. (Ці дзвінки працюють точно так само в Java, вони просто вводять в оману і шкодять читабельності вашого коду.)
Ви можете використовувати анотацію @UtilityClass від lombok https://projectlombok.org/features/experimental/UtilityClass