Участник:Phersu/Java vs. CSharp: различия между версиями
Phersu (обсуждение | вклад) (Новая страница: «== Адаптеры (анонимные классы) vs. делегаты == Адаптеры в Java более flexible, так как могут хранить …») |
Phersu (обсуждение | вклад) |
||
Строка 19: | Строка 19: | ||
::: public void onKey() { } | ::: public void onKey() { } | ||
:: }); | :: }); | ||
+ | |||
+ | Также делегаты суть second-class citizens, чужды ООП, усложняют язык и VM, вводят дополнительные ненужные типы (MulticastDelegate наследует Delegate, при том что реально используется только класс MulticastDelegate, который нельзя наследовать (хотя он не sealed!), а класс Delegate вообще никак не используется и является технической ошибкой проектирования в .NET 1.0) | ||
См. http://java.sun.com/docs/white/delegates.html | См. http://java.sun.com/docs/white/delegates.html |
Версия 13:42, 11 февраля 2012
Адаптеры (анонимные классы) vs. делегаты
Адаптеры в Java более flexible, так как могут хранить своё состояние между вызовами (что бывает очень полезно). В случае с делегатами в C# состояние предполагается хранить во внешнем scope, что замусоривает код. И делегаты, и адаптеры поддерживают замыкания и отличаются только синтаксисом.
Синтаксис у делегатов покороче, однако адаптеры позволяют объединять несколько методов в один логический listener, благодаря чему в итоге можно сделать API в Java компактнее:
C#:
- public delegate void ClickDelegate();
- public delegate void MoveDelegate();
- public delegate void KeyDelegate();
- obj.OnClick += obj_onClick;
- obj.OnMove += obj_onMove;
- obj.OnKey += obj_onKey;
Java:
- obj.addListener(new Listener() {
- public void onClick() { }
- public void onMove() { }
- public void onKey() { }
- });
- obj.addListener(new Listener() {
Также делегаты суть second-class citizens, чужды ООП, усложняют язык и VM, вводят дополнительные ненужные типы (MulticastDelegate наследует Delegate, при том что реально используется только класс MulticastDelegate, который нельзя наследовать (хотя он не sealed!), а класс Delegate вообще никак не используется и является технической ошибкой проектирования в .NET 1.0)