Как я могу создать служебный класс?

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

public class Util {

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

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

}

Какой лучший метод для создания служебного класса?

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

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

Должен ли я ничего не делать?

4 ответа

Решение

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

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

Классу должно быть присвоено имя, соответствующее его набору предоставляемых утилит (или "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;
    }
}

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

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

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

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

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

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

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

Другие вопросы по тегам