Как можно использовать служебные классы для группировки методов в финальном классе вместо расширения класса?

Джошуа Блох упоминает в своей книге (Effective Java — 2nd Ed) в элементе 4:

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

Кто-нибудь может объяснить эту фразу?


person user1522820    schedule 21.05.2013    source источник


Ответы (1)


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

Итак, у вас будет:

class Utility {
    static utilityMethod() {
        // do something usefull
    }
}

class Application extends Utility {
    someMethod() {
        utilityMethod();
    }
}

Однако это нарушает принципы объектно-ориентированного подхода, поскольку ApplicationClass никогда не предполагалось, что он будет подклассом класса UtilityClass. Вместо этого вы должны использовать:

final class Utility {
    Utility() {
        // avoid instantiation
    }

    static utilityMethod() {
        // do something useful
    }
}

class Application {
    someMethod() {
        UtilityClass.utilityMethod();
    }
}

Разработчики языка Java используют несколько способов, чтобы сделать вышеизложенное более привлекательным для использования. Одним из них является понятие статического импорта. Другой — сделать возможным определение статических методов для интерфейсов. В этом случае вышеприведенное станет:

import static Utility.utilityMethod;

final interface Utility {
    static utilityMethod() {
        // do something useful
    }
}

class Application {
    someMethod() {
        utilityMethod();
    }
}

Что намного короче, тем более что большинство импортов автоматически обрабатывается IDE. Еще несколько обсуждений/указателей вышеизложенного можно найти здесь. Обратите внимание, что до Java 7 включительно вы не можете объявлять статические методы в интерфейсе.

person Maarten Bodewes    schedule 22.06.2013