为什么Java中缺少friend指令?

Jac*_*ack 17 java oop friend-class

我想知道为什么Java的设计没有friendC++中提供的指令,以便更好地控制哪些方法和实例变量可以从已定义类的包外部获得.

我没有看到任何实际的原因或任何特定的缺点,它似乎只是一个设计问题,但如果添加到语言中则不会产生任何问题.

Mih*_*der 10

总的来说,我认为这是因为增加了认知复杂性,并且创造了一个改进的案例数量很少.

我想说在这个时刻生产的极其庞大的java行可以证明friend关键字并不是真正的大损失:).

有关更具体的原因,请参阅@ dwb的答案.

  • 此时生产中极其庞大的java行数可以证明java中的任何随机设计选择都是异常的. (4认同)

DwB*_*DwB 9

以下是我头脑中的几个原因:

  • 朋友不是必需的.这很方便,但不是必需的
  • 朋友支持糟糕的设计.如果一个班级要求朋友访问另一个班级,那你就错了.(见上文,方便,不需要).
  • 朋友打破了封装.基本上,我所有的私人都属于我,那个人(我的朋友).

  • -1用于封装.这是一种常见的误解.这完全是错的.虽然'friend`*可以*用于打破封装,但其他功能也可能被误用.正确使用,`friend`*增强*封装,因为它可以实现更细粒度的访问控制:`friend`取代使用`public`,而不是使用`private`.[C++常见问题解答中的技术说明](http://www.parashift.com/c++-faq-lite/friends.html#faq-14.2)(也就是说,我对包的可见性完全满意,但声称'朋友' `破解封装仍然是错误的.) (20认同)
  • @KonradRudolph 绝对同意。友元类对于关注点分离是必不可少的。例如,我有一个“Serializer”类,它应该被允许写入实例的字段,所以我给了它朋友访问权限。其他类,不能专门写入字段,必须通过我提供的接口。在 Java 中执行此操作的唯一方法是将所有内容放入同一个包中。 (2认同)

小智 6

只有一个非常天真和没有经验的程序员会提倡反对朋友.当然它可能被滥用,但公共数据也是如此,但提供了这种能力.

与流行的观点相反,在许多情况下,特别是对于基础设施功能,其中朋友访问导致更好的设计,而不是更糟糕的设计.当一个方法被FORCED公开时,经常会违反封装,但是我们别无选择,因为Java不支持朋友.