Нужен совет: статические методы в интерфейсе JAVA - PullRequest
0 голосов
/ 01 августа 2011

У меня есть класс, который обрабатывает печать различных сообщений в консоль, давайте вызовем этот класс ConsoleMessages.java.Этот класс является публичным и абстрактным, и все его методы являются публичными и статическими.

Я хочу создать интерфейс для этого класса (назовем его PrintMessages).Я имею в виду, что ConsoleMessages.java будет реализовывать PrintMessages.

Дело в том, что JAVA не поддерживает статические методы в интерфейсе.

Что бы вы посоветовали мне сделать?

Ответы [ 4 ]

3 голосов
/ 01 августа 2011
  • Создайте интерфейс PrintMessages с нужными вам методами.

  • Создайте ConsoleMessages класс, реализующий этот интерфейс.Измените все методы со статического на не статический.

  • Применение ConsoleMessages в качестве экземпляра singleton .Это может быть достигнуто разными способами, либо делая это самостоятельно, либо используя каркас внедрения зависимостей .

1 голос
/ 01 августа 2011

На самом деле нет серьезных аргументов против статических методов в интерфейсе. Ничего плохого не случится.

Интерфейс может иметь статические поля и классы статических членов, поэтому статические методы могут быть присоединены через них, хотя и с одной дополнительной косвенной ссылкой

interface MyService

    static public class Factory
        static public MyService get(...)
            return ...;

MyService service = MyService.Factory.get(args);
0 голосов
/ 01 августа 2011

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

Статические методы можно вызывать только с использованием точного имени класса (или, альтернативно, имени некоторого подкласса), нет смысла использовать интерфейс для этого.

Итак, у вас есть два варианта:

  • Выбросьте свой интерфейс и оставайтесь со статическими методами.
  • Создайте все методы (или хотя бы те, которыебыть в интерфейсе) не статично, а ваш реализующий класс не абстрактный.Чтобы вызвать их, нужен объект класса (реализующий этот интерфейс).
0 голосов
/ 01 августа 2011

Если вам нужно определить интерфейсы для служебного класса, тогда, возможно, пришло время пересмотреть ваш выбор дизайна. Ваш класс ConsoleMessages, по-видимому, перерос свое первоначальное использование в качестве полигона для «общих служебных функций».

Короткий ответ? Время рефакторинга.

...