Приватный метод интерфейса
Приватный метод интерфейса объявляется с модификатором
доступа private внутри интерфейса и доступен
только для других методов этого же интерфейса.
Приватные методы нельзя вызывать из классов, реализующих
интерфейс, и нельзя переопределять. Они появились
в Java 9 и используются для вынесения общей логики
из default и static методов, чтобы
избежать дублирования кода. Приватный метод может быть
обычным (нестатическим) или статическим. Обычный
приватный метод вызывается из других нестатических
методов интерфейса, а статический приватный метод -
из статических методов интерфейса.
Синтаксис
private returnType methodName(parameters)
{
// body
}
private static returnType methodName(parameters)
{
// body
}
Пример
Давайте создадим интерфейс с приватным методом
и вызовем его из default метода:
public class Main
{
interface Greeter
{
default void greet(String name)
{
System.out.println(buildMessage(name));
}
private String buildMessage(String name)
{
return "Hello, " + name + "!";
}
}
static class SimpleGreeter implements Greeter
{
}
public static void main(String[] args)
{
SimpleGreeter greeter = new SimpleGreeter();
greeter.greet("abcde");
}
}
Результат выполнения кода:
"Hello, abcde!"
Пример
Давайте вынесем общую логику в статический приватный
метод и вызовем его из двух static методов
интерфейса:
public class Main
{
interface Calculator
{
static int sum(int a, int b)
{
return apply(a, b, "+");
}
static int multiply(int a, int b)
{
return apply(a, b, "*");
}
private static int apply(int a, int b, String op)
{
if (op.equals("+"))
{
return a + b;
}
return a * b;
}
}
public static void main(String[] args)
{
System.out.println(Calculator.sum(2, 3));
System.out.println(Calculator.multiply(2, 3));
}
}
Результат выполнения кода:
5
6
Пример
Давайте попробуем вызвать приватный метод интерфейса из внешнего класса. Такой код не скомпилируется, потому что приватный метод виден только внутри самого интерфейса:
public class Main
{
interface Greeter
{
private String buildMessage(String name)
{
return "Hello, " + name + "!";
}
}
static class SimpleGreeter implements Greeter
{
public void greet(String name)
{
// System.out.println(buildMessage(name));
// compile error: buildMessage has private access
}
}
public static void main(String[] args)
{
System.out.println("abcde");
}
}
Результат выполнения кода:
"abcde"