2013-06-22 3 views
3

Я понимаю методы расширения C#, поскольку они позволяют добавлять новые методы к уже закрытому определению класса. Java-защитник/методы расширения, похоже, совершенно разные. Например:Каково практическое использование методов расширения в Java?

public interface Interfacable { 
    public void regular(); 
    public default void defender() { System.out.println("I am protected"); }; 
} 

Хорошо, так что я понимаю, что вы можете сделать «признак-у» вещи с методами расширения Java, но я не понимаю, почему это называется то же самое («расширение»), если Кажется, э-э, не делайте то же самое. Может ли кто-нибудь помочь мне с этим?

+0

Это не скомпилировано. Существует Aspect Oriented Programming (AOP), которое звучит так, как вы хотите, но не это. – SJuan76

+0

Должно? Вы используете Java-8? – sircodesalot

+1

Нет, Java 7, который вышел последним. Если вы хотите обсудить Java 8, вы должны были указать это в вопросе. – SJuan76

ответ

5

Причина, по которой они были добавлены, была частью добавления закрытий на Java, чтобы был простой путь обновления к таким вещам, как классы коллекции. Задача с добавлением закрытий - теперь есть множество функций, которые вы хотите добавить в стандартные коллекции. Однако, если вы добавите их в существующие интерфейсы, вы нарушите любые реализации этих интерфейсов. Этот способ заключается в добавлении дополнительного интерфейса с новыми методами. Это возможно без методов виртуального расширения, однако у него есть свой собственный недостаток. А именно, что добавление этого нового интерфейса должно быть добавлено до его использования. Поскольку сегодня, вероятно, много реализаций, может потребоваться много времени, чтобы обновить все эти реализации. Тем не менее, в то же время способ, которым вы хотите добавить методы, довольно несовместим с реализацией. Они должны делать в основном то же самое, по крайней мере, в базовом случае. То, как команда, которая построила это, решила обработать это дело, включала спецификацию поведения по умолчанию, которое можно было бы переопределить. Таким образом, с добавлением интерфейса есть функциональность, и разработчик библиотеки решает, что они хотят написать другую реализацию. Ключ, который им не нужен, или есть функциональность стоп-кадра, пока они этого не сделают.

Долгий срок, поскольку они в основном действуют как черты, и вы правы, они не то же самое, что и методы расширения на C#. Из того, что я читал, оригинальная реализация этого была больше C#. Тем не менее, решение использовать их таким образом из-за ограничений стиля (т. Е. Неспособных переопределить функциональность) и отсутствия возможности использовать отражение, обнаружить их. Кажется, что имя застряло, хотя подход к реализации изменился.

См. Статью write-up, в которой объясняются методы виртуального расширения, чтобы узнать подробности.

+2

Я думаю, теперь его просто называют «методом по умолчанию», – ZhongYu

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