Интерфейс внутри класса - PullRequest
6 голосов
/ 07 октября 2011

Q1.Могу ли я иметь интерфейс внутри класса в Java?

Q2.Могу ли я иметь класс внутри интерфейса?

Если да, то в каких ситуациях должны использоваться такие классы / интерфейсы.

Ответы [ 2 ]

9 голосов
/ 07 октября 2011

Q1.Да Q2.Да.

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

  • В своем интерфейсе вы можете определить некоторые классы держателей данных, которые будут использоваться реализациями и клиентами.

Один из примеров последнего:

public interface EmailService {

    void send(EmailDetails details);

    class EmailDetails {
        private String from;
        private String to;
        private String messageTemplate;
        // etc...
    }
}
2 голосов
/ 26 апреля 2013

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

Пока не выйдет Java 8 ...

См. http://datumedge.blogspot.hu/2012/06/java-8-lambdas.html (Методы по умолчанию)

Обходной путь для этого:

public interface I
{
    public Class U{
        public static void complexFunction(I i, String s){
             i.f();
             i.g(s) 
        }
    }
}

Тогда вы можете легко вызвать обычную функциональность (после импорта I.U)

U.complexFunction(i,"my params...");

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

public interface I
{
    public Class U{
        I me;
        U(I me){
            this.me = me;
        }

        public void complexFunction(String s){
             me.f();
             me.g(s) 
        }
    }
    U getUtilities();
}

class implementationOfI implements I{
    U u=new U(this);
    U getUtilities(){ return u; }
}

звонит тогда

I i = new implementationOfI();
i.getUtilities().complexFunction(s);

Еще один пряный трюк

  1. предоставляет U как абстрактный, давая возможность для локальной реализации определенных функций для U ...
  2. переопределение U локальным классом и локальным конструктором с использованием I.this вместо принудительной передачи параметра ...
  3. с использованием статического U ... однако тогда каждая операция должна получить I i в качестве параметра ...
  4. использование enum вместо класса, только для статических функций, без дополнительных объектов (эквивалентно первому методу)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...