Я как-то уже писал статьи о том, что нового добавилось в Java 9. Но тогда я упустил один важный момент: начиная с девятой версии Java, в интерфейсах можно описывать приватные методы. Учитывая, что с Java 8 в интерфейсах появились
default-методы, то получаем довольно сильную функциональность на текущий момент. Ещё переменные экземпляров добавить и будет совсем как в полноценных классах.
Для чего же нам в интерфейсах методы с модификатором private? В чём их смысл? Поскольку в дочерних методах и классах, реализующих этот интерфейс, эти методы не будут доступны, то единственное, для чего их можно использовать, так это как вспомогательные методы для default-методов. А точнее говоря, для тех кусков кода, которые повторяются, но которые нежелательно описывать в default-методах, так как они не нужны в дочерних интерфейсах, а тем более не нужны в классах, которые будут реализовывать наш интерфейс.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public interface Monster { int getArmor(); // Наш приватный метод, видимый только в интерфейсе private int calculateHit(int damage, int armor) { int result = damage - armor; return result > 0 ? result : 0; } // default-метод default int calculateHit(int damage) { return calculateHit(damage, getArmor()); } } |
Теперь класс Daemon, реализующий наш интерфейс. В этом классе доступен метод calculateHit(int damage) из интерфейса, но недоступен метод calculateHit(int damage, int armor), так как он имеет модификатор private. Имя метода и параметры здесь не имеют значения для видимости, они могут быть любыми. Важно то, что модификатор private. Сам класс Daemon:
1 2 3 4 5 |
public class Daemon implements Monster { public int getArmor() { return 2; } } |
Пример использования класса Daemon:
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { Daemon daemon = new Daemon(); System.out.println(daemon.calculateHit(3)); } } |
Честно говоря, довольно спорное нововведение. Как-то сильно отходит от общепринятого понятия интерфейсов в других языках, или я чего-то недопонимаю. На мой взгляд, интерфейс на то и интерфейс, чтобы только описывать контракт, а не содержать куски кода.