Абстрактный и приватный (потому что вы не можете переопределить приватный метод)

ы частного интерфейса поддерживаются Java 9.

Эта поддержка допускает неабстрактные методыinterface поделиться кодом между ними. Частные методы могут быть статическими или экземплярами.

Могут ли частные методы интерфейса бытьabstract или жеdefault?

Могу ли я попросить пример, где "private static методы интерфейса "полезны с точки зрения кода?

 ZhekaKozlov14 сент. 2017 г., 14:23
Вам нужно всего 10 секунд, чтобы проверить это

Ответы на вопрос(3)

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

По умолчанию и абстрактный (потому чтоdefault означает противоположностьabstract)По умолчанию и закрытый (потому что вы не можете переопределить закрытый метод)Абстрактный и приватный (потому что вы не можете переопределить приватный метод)
Решение Вопроса

нетчастные методы в интерфейсах, предположительно, предназначены для того, чтобы бить в кусок кода, который является внутренним дляinterface реализация. Так как они относятся к реализации (состоят из тела), а не к декларации, они не могут бытьdefault и ниabstract когда определено.

A private метод являетсяstatic метод или метод экземпляра не по умолчанию, который объявлен сprivate ключевое слово. Вы не можете объявитьdefault метод такжеprivate потому чтоdefault методы предназначены для вызова из классов, которые реализуют свои декларирующие интерфейсы.

private static методы полезны для абстрагирования общего фрагмента кода отstatic методы интерфейса при определении его реализации.

Пример частного статического метода в интерфейсе может быть следующим. Рассмотрим объект,Question.java на StackOverflow определяется как:

class Question {
    int votes;
    long created;
}

и интерфейс, который предлагает сортировку по функциональности, как видно из перечисленных вопросов наStackOverflowTag :

public interface StackOverflowTag {

    static List<Question> sortByNewest(List<Question> questions) {
        return sortBy("NEWEST", questions);
    }

    static List<Question> sortByVotes(List<Question> questions) {
        return sortBy("VOTE", questions);
    }

    //... other sortBy methods

    private static List<Question> sortBy(String sortByType, List<Question> questions) {
        if (sortByType.equals("VOTE")) {
            // sort by votes
        }
        if (sortByType.equals("NEWEST")) {
            // sort using the created timestamp
        }
        return questions;
    }
}

Здесьprivate static методsortBy интерфейса внутренне реализует сортировку на основеsortOrderType совместное использование реализации с двумя открытыми статическими методами интерфейса, которые могут в дальнейшем использоватьсяStackOverflowTagConsumer может просто получить доступ к этим статическим методам интерфейса как:

public class StackOverFlowTagConsumer {

    public static void main(String[] args) {
        List<Question> currentQuestions = new ArrayList<>();

        // if some action to sort by votes
        displaySortedByVotes(currentQuestions);

        // if another action to sort by newest
        displaySortedByNewest(currentQuestions);
    }

    private static void displaySortedByVotes(List<Question> currentQuestions) {
        System.out.println(StackOverflowTag.sortByVotes(currentQuestions));
    }

    private static void displaySortedByNewest(List<Question> currentQuestions) {
        System.out.println(StackOverflowTag.sortByNewest(currentQuestions));
    }
}
 Holger18 сент. 2017 г., 12:27
Я не думаю, что это хороший пример. Разрешение делегировать разные методы другому методу, который использует условные выражения для разделения этих вызывающих сторон и выполнения совершенно другого кода, зависящего от вызывающего, является полной противоположностью действительному намерению повторно использоватьобщий код.
 Naman18 сент. 2017 г., 14:00
@Holger Условное выполнение - это просто пример, который я придумал, конечно же, основное намерение состояло в том, чтобы отразить функцию повторного использования, используяprivate static метод.

default Ключевое слово для методов интерфейса существует, потому что для методов интерфейса,abstract подразумевается, если никакой другой модификатор не противоречит ему. До Java 8 это относилось квсе методы интерфейса, которые всегда учитывалисьabstract.

Так как наличие либоstatic или жеprivateуже подразумевает, что это не может бытьabstract (что относится и к обычным классам), нет необходимости добавлятьdefault модификатор и, следовательно, Java исключает эту комбинацию. И нет смысла просить эту комбинацию, так какdefault просто подразумевает, что метод неabstractтехнически, так что добавив его к методу, который уже неabstract ничего не изменит.

С другой стороны, так как единственные методы, требующиеdefault Ключевое слово для объявления, что они неabstract, находятсяpublic методы экземпляра,default Ключевое слово применяется только к переопределяемым методам, что удобно соответствует буквальному значению слова «по умолчанию».

private методы полезны для обеспечения общих операций дляpublic не-abstract методы интерфейса, когда эти общие операции не должны вызываться извне интерфейса напрямую, очень похоже наprivate методы в обычных классах, кроме того, они существуют в Java 8 уже на уровне байтового кода, какdefault а такжеstatic методы могут содержать лямбда-выражения, которые компилируются в синтетическиеprivate методы, поэтому не было технической причины отрицать эту функцию в языке программирования Java.

Ваш ответ на вопрос