Каково назначение ключевого слова по умолчанию в Java?




интерфейс в Java похож на класс, но тело
интерфейс может включать только абстрактные методы и final поля
(константы.)




недавно, я увидел вопрос, который выглядит так



interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}


согласно определению интерфейса,только абстрактные методы разрешено. Почему это позволяет мне компилировать приведенный выше код? Что такое default ключевое слово?



С другой стороны, когда я пытался написать ниже код, то он говорит modifier default not allowed here



default class MyClass{

}


вместо



class MyClass {

}


может кто-нибудь сказать мне цель default ключевое слово? Это разрешено только внутри интерфейса? Чем он отличается от default (модификатор доступа)?

701   7  

7 ответов:

это новая функция в Java 8, которая позволяет interface для обеспечения реализации. Описано в Java 8 JLS-13.5.6. Объявления Методов Интерфейса который читает (частично)

добавлять default метод, или изменение метода от abstract до default, не нарушает совместимость с уже существующими двоичными файлами, но может привести к IncompatibleClassChangeError если уже существующий двоичный файл пытается вызвать метод. Эта ошибка возникает, если тип квалификации,T это подтип двух интерфейсов, I и J, где I и J объявления default метод с той же сигнатурой и результат, а не I, ни J является подинтерфейсом другого.

что нового в JDK 8 говорит (частично)

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

методы по умолчанию были добавлены в Java 8 в основном для поддержки лямбда-выражений. Дизайнеры (умно, на мой взгляд) решили сделать синтаксис lambdas для создания анонимных реализаций интерфейса. Но учитывая, что лямбды могут реализовать только один метод, они будут ограничены интерфейсами с одним методом, что будет довольно серьезным ограничением. Вместо этого были добавлены методы по умолчанию, позволяющие использовать более сложные интерфейсы.

Если вам нужно некоторое убеждение утверждают, что default был введен из-за лямбды, обратите внимание, что соломы много предложение проекта лямбда, Марк Рейнхольд, в 2009 году, упоминает "методы расширения" в качестве обязательной функции, которая будет добавлена для поддержки лямбд.

вот пример, демонстрирующий концепт:

interface Operator {
    int operate(int n);
    default int inverse(int n) {
        return -operate(n);
    }
}

public int applyInverse(int n, Operator operator) {
    return operator.inverse(n);
}

applyInverse(3, n -> n * n + 7);

очень надуманный, я понимаю, но должна показать, как default поддерживает лямбда-выражения. Потому что inverse по умолчанию он может быть легко переопределен реализующим классом, если требуемый.

в Java 8 введено новое понятие, называемое методами по умолчанию. Методы по умолчанию - это те методы, которые имеют некоторую реализацию по умолчанию и помогают в развитии интерфейсов без нарушения существующего кода. Давайте посмотрим на пример:

 public interface SimpleInterface {
    public void doSomeWork();

    //A default method in the interface created using "default" keyword

    default public void doSomeOtherWork(){

    System.out.println("DoSomeOtherWork implementation in the interface");
       }
    }

 class SimpleInterfaceImpl implements SimpleInterface{

  @Override
  public void doSomeWork() {
  System.out.println("Do Some Work implementation in the class");
   }

 /*
  * Not required to override to provide an implementation
  * for doSomeOtherWork.
  */

 public static void main(String[] args) {
   SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
   simpObj.doSomeWork();
   simpObj.doSomeOtherWork();
      }
   }

и вывод:

сделать некоторые работы реализации в классе
Реализация DoSomeOtherWork в интерфейсе

то, что было упущено из виду в приведенных выше ответах, было его ролью в аннотациях. Еще в Java 1.5,default ключевое слово появилось как средство для указать значение по умолчанию для поля аннотация.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Processor {
    String value() default "AMD";
}

Это был перегружен С введением Java 8, чтобы позволить определить метод по умолчанию в интерфейсах.

что-то еще, что было упущено из виду: причина, по которой декларация default class MyClass {} является недопустимым из-за так что классы объявляются вообще. В языке нет положения, которое позволяет этому ключевому слову появляться там. Это тут появляются для объявления метода интерфейса, хотя.

новая Java 8 функция (Методы По Умолчанию) позволяет интерфейсу обеспечить реализацию, когда он помечен default ключевое слово.

Например:

interface Test {
    default double getAvg(int avg) {
        return avg;
    }
}
class Tester implements Test{
 //compiles just fine
}

тест интерфейса использует ключевое слово по умолчанию, которое позволяет интерфейсу обеспечить реализацию метода по умолчанию без необходимости реализации этих методов в классах, использующих интерфейс.

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

Факты И Ограничения:

1-может быть установлено только в интерфейсе, а не в классе или абстрактный класс.

2-должен обеспечить тело

3-это не предполагается быть общедоступным или абстрактным, как и другие обычные методы, используемые в интерфейсе.

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

очень хорошее объяснение находится в Учебники Java™, часть объяснения заключается в следующем:

Рассмотрим пример, в котором участвуют производители автомобилей с компьютерным управлением, которые публикуют стандартные отраслевые интерфейсы, описывающие, какие методы могут быть вызваны для управления их автомобилями. Что, если эти производители автомобилей с компьютерным управлением добавят новые функции, такие как полет, в свои автомобили? Эти производители должны будут указать новые методы для включения других компании (например, производители электронных приборов наведения) адаптируют свое программное обеспечение к летающим автомобилям. Где бы эти производители автомобилей объявили эти новые методы, связанные с полетами? Если они добавят их к своим исходным интерфейсам, то программисты, которые реализовали эти интерфейсы, должны будут переписать свои реализации. Если они добавляют их как статические методы, то программисты будут рассматривать их как полезные методы, а не как существенные, основные методы.

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

Comments

    Ничего не найдено.