Это хорошая идея, чтобы класс был вложен в интерфейс? - PullRequest
3 голосов
/ 01 августа 2010

Возможно ли иметь внутренний класс внутри интерфейса в Java ???

Ответы [ 7 ]

3 голосов
/ 01 августа 2010

Можно. Но вот что О'Рейли говорит об этом:

Вложенные классы в интерфейсах?

Java поддерживает концепцию вложенных классов в интерфейсах. Синтаксис и динамика работают так же, как вложенные классы, объявленные в классе. Однако объявление класса, вложенного в интерфейс, было бы крайне плохим программированием. Интерфейс - это абстракция концепции, а не ее реализация. Поэтому детали реализации должны быть исключены из интерфейсов. Помните, только то, что вы можете отрезать свою руку с помощью пилы, не означает, что это особенно хорошая идея.


Тем не менее, я мог видеть аргумент для статического служебного класса, вложенного в интерфейс. Хотя то, почему он должен быть вложен в интерфейс, а не является отдельным классом, совершенно субъективно.

2 голосов
/ 01 августа 2010

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

public interface ComplexOperationService {

    ComplexOperationResponse doComplexOperation( String param1, Object param2 );

    public static class ComplexOperationResponse {
        public int completionCode;
        public String completionMessage;
        public List<Object> data;
        // Or use private members & getters if you like...
    }

}

Очевидно, что это можно сделать и в отдельном классе, но мне кажется, что я храню весь API, определенный интерфейсом, в одном месте, а не разбросан.

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

Непосредственно не отвечает на ваш вопрос, но в соответствующей заметке вы также можете вложить интерфейс в другой интерфейс. Это приемлемо, особенно если вы хотите предоставить просмотров . Классы коллекции Java делают это, например, Map.java в случае представления Map.Entry:

public interface Map<K,V> {
   ...
   public static interface Entry<K,V> {
       ....
   }
}

Это приемлемо, потому что вы не смешиваете детали реализации в вашем интерфейсе. Вы только указываете другой контракт.

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

Да, это возможно, но это не обычная практика.

interface Test
{
    class Inner
    { }
}

class TestImpl implements Test
{
    public static void main(String[] arg)
    {
        Inner inner = new Inner();
    }
}
0 голосов
/ 01 августа 2010

Это законно, но я действительно делаю это только с вложенными интерфейсами (как уже упоминалось) или вложенными перечислениями Например:

public interface MyInterface {

    public enum Type { ONE, TWO, THREE }

    public Type getType();

    public enum Status { GOOD, BAD, UNKNOWN }

    public Status getStatus();

}
0 голосов
/ 01 августа 2010

Один вариант использования для этого, который я считаю весьма полезным, - это если у вас есть конструктор, который создает экземпляр интерфейса.Если построитель является статическим членом интерфейса, вы можете создать экземпляр, подобный этому:

DigitalObject o = new DigitalObject.Builder(content).title(name).build();
0 голосов
/ 01 августа 2010

Да.Прямо из спецификации языка :

внутренний класс - это вложенный класс, который не объявлен явно или неявно static.

И (выделено жирным шрифтом):

A вложенный класс - это любой класс, объявление которого происходит в теле другого класса илиинтерфейс .

...