Абстракции
Необходимо обязательно следить за доступами! У interface доступы к методам всегда public, а в классе, реализующем может быть не указан модификатор доступа, который по умолчанию объявлен как default package-private. Это приведет к ошибке:
1 | public interface X { |
Любое определение сущностей желательно начинать с абстракции, даже если она будет пустой (т.е. будет маркировочным) - это упростит поиск по структуре классов, а так же анализ Java Heap.
Реализация методов
Необходимо следить за возвращаемыми типами:
1 | interface X { |
Класс ImplOk определен корректно, т.к. Integer наследуется от Number, а как отмечалось ранее, на уточнение класса при возврате из метода, компилятор реагирует без ошибок.
Type-cast
Как отмечалось ранее, type-cast класса в может быть с ошибкой компиляции, если классы никак не связаны между собой (это касается и instanceof):
1 | Number x = 1; |
Но для интерфейсов данное правило не работает:
1 | Number x = 1; |
Указанное выше правило не работает в случае классов, помеченных как final
1 | public class X extends Number {} |
Interface методы
Interface default-метод
- может применяться только к методам интерфейса;
- должен иметь тело метода;
- должен быть
public; - не может быть
abstract,finalилиstatic; - может быть переопределен в реализации;
- если класс наследуется от 2 интерфейсов с default маркерами, то метод необходимо будет переопределять (возможно, вызов конкретной реализации в любом из интерфейсов).
1 | public interface FaceA { |
Такое же правило касается и наследования одним интерфейсом других - несколько default методов необходимо свести в одну единую реализацию метода.
Interface static-метод
- может не указывать модификатор доступа - тогда он будет
public. Если указывать, то доступен толькоpublic; - если метод имеет
static, значит должен иметь тело метода; - не может быть
finalилиabstract; - не может быть переопределен;
- при обращении может быть использовано только имя данного интерфейса (не наследников).
1 | public interface X { |
Interface private-метод
- должен содержать тело;
- может быть использован только
defaultиprivate(но неprivate static) методами того же интерфейса:
1 | public interface X { |
Поскольку метод не будет виден классами, реализующими интерфейс, данные методы очень удобны когда необходимо ограничить видимость метода, но при этом, распространить его действие на все реализующие классы.
Interface private-static-метод
- должен содержать тело;
- могут быть вызваны любым методом, но только в рамках этого интерфейса.
1 | public interface X { |