Vit*_*liy 4 java extension-methods api-design java-8 default-method
所以我们有默认方法,也被称为防御方法和'虚拟扩展方法'.
虽然我很欣赏默认方法的巨大价值(在某些方面甚至比它们的C#对应物更强大)但我想知道什么是允许扩展现有接口而不访问其源代码的决定.
在他的一个答案中, Brian Goetz提到默认方法是为了方便和界面演变而设计的.因此,如果我们编写一个接口,我们可以在那里填充我们通常必须放在一个单独的类中的各种实用方法.那么为什么不加倍努力并允许它不受我们控制的接口?
虽然Brian Goetz提到默认方法也会用于方便,但这并不意味着它是默认方法的第一个目标.
提醒一下:为了支持界面演化,存在默认方法,这是面对lambda引入时非常需要的东西(因为引入lambda使用方法通常意味着应该添加新方法).
您正在撰写您的帖子,就好像扩展方法没有任何缺点,因为它们存在于C#中,但是:
扩展方法具有巨大的可发现性问题:
扩展方法本质上不允许某些标准的消歧机制:
扩展方法不灵活:
在这三个缺点中,Java 8中存在的默认方法都没有.
您应该注意,在C#中包含扩展方法的重要原因是启用LINQ.由于Java为其流提供了另一种设计,我没有看到Java语言设计者将其添加为理所当然.
这是由一种哲学信念驱动的:API设计者应该控制他们的API.虽然向API中外部注入方法肯定很方便,但它会破坏API设计者对其API的控制.(这有时被称为"猴子修补".)
在术语上:C#所谓的"扩展方法"只是扩展方法的一种形式,而不是扩展方法的定义; Java的默认方法也是扩展方法.主要区别在于:C#扩展方法是静态的,并在使用现场注入; Java是虚拟和声明站点.其次,C#扩展方法被注入到类型中,而Java的默认方法是类的成员.(这允许您在C#中注入sum()方法List<int>而不影响其他List实例化.)
如果您已经习惯了C#方法,那么很自然地认为这是"正确"或"正常"或"真实"的方式,但实际上,这只是众多可能方式中的一种.正如其他海报所指出的那样,与Java的默认方法相比,C#扩展方法有一些非常严重的缺点(例如,反馈可发现性差,通过文档可发现性差,不可覆盖,需要特殊的冲突管理规则).因此,相比之下,Java玻璃在这里已经超过了一半.
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |