Подтвердить что ты не робот

Как создать класс утилиты?

Я хочу создать класс с помощью служебных методов, например

public class Util {

   public static void f (int i) {...}

   public static int g (int i, int j) {...}

}

Каков наилучший способ создания класса утилиты?

Должен ли я использовать частный конструктор?

Должен ли я сделать класс утилиты для абстрактного класса?

Нечего делать?

4b9b3361

Ответ 1

Для Java-класса с полным отсутствием состояния я предлагаю объявить класс public и final и иметь частный конструктор для предотвращения создания экземпляров. Ключевое слово final предотвращает создание подклассов и может повысить эффективность во время выполнения.

Класс должен содержать все static методы и не должен объявляться как abstract (поскольку это подразумевает, что класс не является конкретным и должен быть каким-то образом реализован).

Классу должно быть присвоено имя, соответствующее его набору предоставляемых утилит (или "Util", если класс должен предоставлять широкий спектр некатегоризованных утилит).

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

Методы в классе должны иметь соответствующие имена.

Методы, используемые только самим классом, должны быть закрытыми.

У класса не должно быть никаких не окончательных/нестатических полей класса.

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

Пример:

public final class ExampleUtilities {
    // Example Utility method
    public static int foo(int i, int j) {
        int val;

        //Do stuff

        return val;
    }

    // Example Utility method overloaded
    public static float foo(float i, float j) {
        float val;

        //Do stuff

        return val;
    }

    // Example Utility method calling private method
    public static long bar(int p) {
        return hid(p) * hid(p);
    }

    // Example private method
    private static long hid(int i) {
        return i * 2 + 1;
    }
}

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

Ответ 2

Согласно Джошуа Блоху (Эффективная Java), вы должны использовать частный конструктор, который всегда выдает исключение. Это, наконец, препятствует пользователю создавать экземпляр класса util.

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

Ответ 3

Я бы сделал класс final, и каждый метод был бы static.

Таким образом, класс не может быть расширен и методы могут быть вызваны Classname.methodName. Если вы добавляете членов, убедитесь, что они работают потокобезопасными;)

Ответ 4

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

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