Правильный способ создания приватных методов в интерфейсе Java - PullRequest
0 голосов
/ 21 января 2020

Я работаю с базой данных и создаю общедоступный интерфейс c под названием Dao with extends из AutoCloseabe, поэтому у меня есть класс, который реализует этот интерфейс, но я хочу создать там некоторые частные методы, но им все еще нужен Autocloseable. Поэтому мой вопрос в том, что я не могу создавать частные методы в интерфейсе, не определяя их в интерфейсе. Что произойдет, если я создаю приватный метод в классе, но не переопределяю из Dao? У них не будет автозамены, не так ли? А если нет, какое решение я могу реализовать?

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Мотивация введения в Java 9 частных методов в интерфейсах по тем же причинам, по которым вы бы использовали частные методы в любом другом теле класса. Это позволяет разбить код на повторно используемые управляемые методы, которые не наследуются:

default public boolean tryHeads() {
    return flip();
}

default public boolean tryTails() {
    return !flip();
}

private boolean flip() {
    return ThreadLocalRandom.current().nextBoolean();
}

Это сильно упрощено. Но см. аналогичный вопрос от меня для более глубокого понимания.

0 голосов
/ 21 января 2020

Частные методы не имеют большого смысла в интерфейсе, поскольку основная идея интерфейса - предоставить интерфейс для взаимодействия объектов друг с другом. Поскольку закрытые методы не видны другим объектам, они не могут использовать их для общения и отправки сообщений.

Если вы хотите использовать закрытые методы, я бы посоветовал вам использовать abstract class.

В итоге:

В: Поэтому мой вопрос заключается в том, что я не могу создавать частные методы в интерфейсе, не определив их в интерфейсе .

Именно в этом суть interface; они определяют API publi c, не заботясь о внутренней реализации.

Q: Что произойдет, если я создаю в классе закрытый метод, но не переопределяю из Dao?

Если вы объявите метод в abstract class и не переопределите его, могут произойти две вещи:

  1. Метод был помечен как abstract: вы получите ошибку компиляции, говорящую что ваш класс реализации не удовлетворяет спецификации родительского класса.

1.1 Если вы объявили метод в интерфейсе и не реализовали его, вы получите ту же ошибку, сообщающую, что ваша реализация класс не удовлетворяет интерфейсу, который он пытается реализовать.

Метод был public и не помечен как final в abstract class: вы можете или не можете переопределить его. Если вы не переопределите его, будет использоваться реализация родительского класса; если вы полностью его переопределите, код вашего дочернего класса будет выполнен. Если вы вызовете super.method () и затем свою реализацию, оба кода будут выполнены.
...