Можно ли создать внутренний класс в интерфейсе?
Если это возможно, зачем нам создавать такой внутренний класс, если мы не собираемся создавать какие-либо объекты интерфейса?
Помогают ли эти внутренние классы в любом процессе разработки?
Можно ли создать внутренний класс в интерфейсе?
Если это возможно, зачем нам создавать такой внутренний класс, если мы не собираемся создавать какие-либо объекты интерфейса?
Помогают ли эти внутренние классы в любом процессе разработки?
Да, вы можете создать как вложенный класс, так и внутренний класс внутри интерфейса Java (обратите внимание, что вопреки распространенному мнению не существует такой вещи, как « статический внутренний класс »: это просто не имеет смысла, нет ничего «внутреннего» и «нет» outter, когда вложенный класс является статическим, поэтому он не может быть «статическим внутренним»).
В любом случае, следующие компилируются нормально:
public interface A {
class B {
}
}
Я видел, как он использовал своего рода «средство проверки контрактов» непосредственно в определении интерфейса (ну, в классе, вложенном в интерфейс, который может иметь статические методы, в отличие от самого интерфейса, который не может). Выглядит вот так, если я правильно помню.
public interface A {
static class B {
public static boolean verifyState( A a ) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
Обратите внимание, что я не комментирую полезность такой вещи, я просто отвечаю на ваш вопрос: это можно сделать, и это один из видов использования, который я видел.
Сейчас я не буду комментировать полезность такой конструкции, и из того, что я видел: я видел это, но это не очень распространенная конструкция.
Кодовая база 200KLOC здесь, где это происходит точно в нулевое время (но тогда у нас есть много других вещей, которые мы считаем плохими практиками, которые тоже происходят точно в нулевое время, что другие люди сочли бы совершенно нормальным, так что ...).
interface
s не может иметь внутренних классов. Вы можете опуститьstatic
модификаторinterface
вложенного класса, но все же это вложенный класс, а не внутренний класс.B
класс будет статическим вложенным классом, а не внутренним классом; Особый подход к интерфейсам. Я не смог найти упоминания об этом в Интернете, за исключением самой спецификации: «Класс-член интерфейса неявно статичен, поэтому никогда не считается внутренним классом». docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3Да, у нас могут быть классы внутри интерфейсов. Одним из примеров использования может быть
Здесь в коде есть два вложенных класса, которые предназначены для инкапсуляции информации об объектах событий, которые позже используются в определениях методов, таких как getKeyEvents (). Их наличие внутри интерфейса ввода улучшает согласованность.
источник
Допустимое использование, IMHO, - это определение объектов, которые принимаются или возвращаются включающими методами интерфейса. Обычно структуры хранения данных. Таким образом, если объект используется только для этого интерфейса, у вас все будет более связным.
По примеру:
Но все равно ... это дело вкуса.
источник
Цитата из спецификации Java 7 :
НЕЛЬЗЯ объявлять нестатические классы внутри интерфейса Java, что для меня имеет смысл.
источник
Интересный вариант использования - предоставить своего рода реализацию по умолчанию для методов интерфейса через внутренний класс, как описано здесь: https://stackoverflow.com/a/3442218/454667 (для преодоления проблемы наследования одного класса).
источник
Это, безусловно, возможно, и один из случаев, когда я нашел это полезным, - это когда интерфейс должен генерировать пользовательские исключения. Вы сохраняете исключения в связанном с ними интерфейсе, что, на мой взгляд, часто бывает лучше, чем засорять исходное дерево кучей тривиальных файлов исключений.
источник
Да, внутри интерфейса могут быть определения статических классов, но, возможно, наиболее полезным аспектом этой функции является использование типов перечислений (которые представляют собой особый вид статических классов). Например, у вас может быть что-то вроде этого:
источник
То, что упоминает @Bachi, похоже на трейты в Scala и фактически реализовано с использованием вложенного класса внутри интерфейса. Это можно смоделировать на Java. Смотрите также особенности java или шаблон миксинов?
источник
Может быть, если вам нужны более сложные конструкции, такие как различные варианты поведения, подумайте:
Это ваш интерфейс, и это будет исполнитель:
Могут предоставить некоторые статические реализации, но разве это не сбивает с толку, я не знаю.
источник
Я нашел применение этому типу конструкции.
У вас есть доступ ко всем сгруппированным константам; имя класса в этом случае действует как пространство имен.
источник
Вы также можете создать статические классы «Помощник» для общих функций для объектов, реализующих этот интерфейс:
источник
Мне он нужен прямо сейчас. У меня есть интерфейс, в котором было бы удобно возвращать уникальный класс из нескольких его методов. Этот класс имеет смысл только как контейнер для ответов от методов этого интерфейса.
Следовательно, было бы удобно иметь статическое определение вложенного класса, которое связано только с этим интерфейсом, поскольку этот интерфейс должен быть единственным местом, где когда-либо создается этот класс контейнера результатов.
источник
Например, трейты (что-то вроде интерфейса с реализованными методами) в Groovy. Они компилируются в интерфейс, который содержит внутренний класс, в котором реализованы все методы.
источник