Почему бы не конструкторы по умолчанию в Java 8?

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

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


person Supun Wijerathne    schedule 30.06.2016    source источник
comment
Почему вы хотите иметь возможность создавать экземпляр интерфейса?   -  person Michael Markidis    schedule 30.06.2016
comment
конструкторы обычно устанавливают переменные-члены, которых нет в интерфейсе. так что же обычно делает этот конструктор по умолчанию? кроме того, класс может реализовывать несколько интерфейсов — так какой конструктор по умолчанию унаследует ваш класс?   -  person slipperyseal    schedule 30.06.2016
comment
Даже не для этого интерфейса он может быть унаследован конкретными дочерними объектами, как конструктор абстрактного класса.   -  person Supun Wijerathne    schedule 30.06.2016
comment
@SlipperySeal кое-что согласен с вашим 1-м пунктом. Но есть фреймворки DI, которые широко используются сегодня, такие как Guice, которые можно использовать для внедрения зависимостей, что имеет некоторый смысл. И если вы прочитаете это stackoverflow. ком/вопросы/12150240/ . Вы можете подумать, что моя точка зрения имеет какой-то смысл. И у вашего второго пункта уже есть ответ на использование метода по умолчанию с одним и тем же именем в разных интерфейсах для класса.   -  person Supun Wijerathne    schedule 30.06.2016
comment
Кто-нибудь может объяснить, почему это не имеет никакого смысла Почему бы вам не попытаться объяснить, почему это имеет смысл?   -  person shmosel    schedule 30.06.2016
comment
@shmosel хорошая мысль. :) Интересно, почему абстрактные классы могут быть? И вы можете прочитать мой последний комментарий. :)   -  person Supun Wijerathne    schedule 30.06.2016
comment
Абстрактные классы могут иметь состояние, а интерфейсы — нет — методы по умолчанию только определяют алгоритм, но не могут хранить какое-либо состояние, кроме как в виде локальной переменной — а конструкторы являются обязательной точкой входа для обеспечения состояния для объекта, которое бесполезно для интерфейсов ( нет государства).   -  person Smutje    schedule 30.06.2016
comment
Попробуйте объяснить, какую проблему вы хотите решить с помощью конструктора интерфейса. Тогда мы сможем показать вам, что конструктор не решит вашу проблему.   -  person Holger    schedule 30.06.2016


Ответы (2)


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

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

person J. Pichardo    schedule 30.06.2016
comment
кроме того, методы по умолчанию решают конкретную проблему. конструкторы по умолчанию, вероятно, вызвали бы только проблемы, если бы они могли быть реализованы и работали с правилами системы типов java. - person slipperyseal; 30.06.2016
comment
@SlipperySeal, какую конкретную проблему решают методы по умолчанию? - person Supun Wijerathne; 30.06.2016
comment
@SupunWijerathne из документации: методы по умолчанию позволяют добавлять новые функции в интерфейсы ваших библиотек и обеспечивать двоичную совместимость с кодом, написанным для более старых версий этих интерфейсов. - person slipperyseal; 30.06.2016
comment
@SlipperySeal, спасибо. :) Но на самом деле я не понял этих слов. Во всяком случае, я буду искать более простое объяснение. - person Supun Wijerathne; 30.06.2016
comment
Конструктор по умолчанию может вызывать метод интерфейса, по существу вызывая вызов метода инициализации при создании класса, реализующего его. Пригодится ли она для чего-нибудь, я не знаю. - person hyde; 30.06.2016

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

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

MyFace obj = new MyFace(){};

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

person Bohemian♦    schedule 30.06.2016
comment
Я не уверен, действительно ли это создает экземпляр интерфейса. Вы действительно создаете встроенную реализацию. - person Michael Markidis; 30.06.2016
comment
Наличие конструктора интерфейса по умолчанию позволит избежать гипотетического кода, такого как MyFace obj = new MyFace(){}; obj.init();´, то есть немного больше, чем просто ´{}´, особенно если вызов init будет обязательным для реализации. - person hyde; 30.06.2016
comment
@hyde: это бессмысленный сценарий, так как init() не может сделать ничего полезного. Объект, созданный с помощью new MyFace(){}, не содержит состояния, которое мог бы изменить метод init(). - person Holger; 30.06.2016