2016-06-30 3 views
2

Я прочитал this вопрос. В ответе говорится, что даже в Java 8 (где мы можем использовать методы по умолчанию в интерфейсах), у нас не может быть стандартных конструкторов. И в нем говорится, что это не имеет смысла.Почему не конструкторы по умолчанию в Java 8?

Может кто-нибудь объяснить, почему это не имеет никакого смысла или что-то еще, потому что нет поддержки конструкторов по умолчанию в Java 8?

+3

Зачем вам нужно создавать экземпляр интерфейса? –

+4

конструкторы обычно устанавливают переменные-члены, которых у интерфейса нет. так что обычно делает этот конструктор по умолчанию? Кроме того, класс может реализовывать несколько интерфейсов - так, какой конструктор по умолчанию унаследовал бы ваш класс? – slipperyseal

+0

Даже не для этого интерфейса, он может быть унаследован конкретными дочерними объектами, такими же, как конструктор абстрактного класса. –

ответ

3

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

Что касается конструкторов по умолчанию, это действительно не имеет смысла, поскольку метод по умолчанию имеет логику, какую логику вы объявляете по конструктору по умолчанию?

+2

также, методы по умолчанию решают определенную проблему. конструкторы по умолчанию, вероятно, вызовут только проблемы, если они даже могут быть реализованы и работать с правилами системы типа java – slipperyseal

+0

@SlipperySeal, какова конкретная проблема, которую решают методы по умолчанию? –

+3

@SupunWijerathne из документации: «Способы по умолчанию позволяют добавлять новые функции к интерфейсам ваших библиотек и обеспечивать двоичную совместимость с кодом, написанным для более старых версий этих интерфейсов». – slipperyseal

0

Конструкторы какого? Только классы имеют конструкторы, которые создают экземпляры.

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

MyFace obj = new MyFace(){}; 

Кажется, вы оплакивая того, чтобы закодировать два дополнительных символов {}.

+0

thnx для ответа. Но я не понимаю ур. :( –

+1

Я не уверен, действительно ли это создает «экземпляр» интерфейса. На самом деле вы создаете встроенную реализацию. –

+0

Наличие интерфейса по умолчанию конструктора позволит избежать гипотетического кода, такого как MyFace obj = new MyFace() {}; obj.init(); ', поэтому немного больше, чем просто' {} ', особенно если вызов init будет обязательным для реализации. – hyde

Смежные вопросы