为什么Java 7中没有本地属性?

19

为什么原生属性将不成为Java 7的一部分,有任何合理的理由吗?

原生属性是指Java中可以通过本地代码访问的系统级属性。


3
不要仅凭语言的功能数量来衡量其能力,而应考虑平台、生态系统等因素... - ivan_ivanovich_ivanoff
那是一个非常棒的评论,伊万。我正在学习C#,发现Java缺少的许多功能并不像它们能解决更具挑战性的问题那样引人注目。有些功能似乎只会导致更复杂的代码,例如通过outs从方法返回多个值,或者臭名昭著的goto语句。 - Frank Visaggio
5个回答

18

这与课程安排和资源等高级原因有关。实现属性并理解所有影响和与其他语言特性的交集是一项庞大的任务,类似于各种Java 5语言更改的规模。

但我认为Sun没有推动属性的真正原因与闭包相同:

1)对于实现看法存在分歧,或者说,存在许多竞争性替代方案和对属性有不同看法的人,这些人在重要部分的实现上意见不一。

2)更重要的是,是否需要此功能存在显著的共识缺乏。虽然很多人想要属性,但也有很多人认为它不是必要的或者有用的(特别是服务器端的程序员们认为属性对他们的日常工作远不如Swing程序员重要)。

有关属性历史,请参见:


有趣。我不知道关于属性的争议,至少不是像闭包引起的那种激烈争论。你能提供任何链接来填补正反双方的背景吗?我确实同意属性在服务器端不太重要,而JavaFX则满足了客户端的需求。 - erickson
1
作为一名服务器端开发人员,属性是我所拥有的全部。 - trunkc
在旧的属性讨论中添加了一个链接。就个人而言,我非常矛盾。我发现大多数提案并没有让我感到太兴奋。我不确定Java是否能够在这方面走得足够远,真正满足像Groovy或Scala这样的需求。 - Alex Miller

17

在Java中正确地处理属性并不容易。Rémi Forax的工作尤为宝贵,他找出了这可能是什么样子,并发现了很多必须处理的“陷阱”。

与此同时,Java 7已经太久了。闭包辩论是一个巨大且有争议的干扰,浪费了许多可以用来开发得到广泛支持的特性(如属性)的头脑能量。最终决定将主要变化限制在模块化(Project Jigsaw)上,只考虑对语言进行“小改动”(在Project Coin下)。

JavaFX具有美丽的属性支持,因此Sun显然了解属性的价值并知道如何实现它们。但是,由于JavaFX属性的赏心悦目,开发人员不太可能接受Java中半成品的属性实现。如果值得做,就值得做好。


4
能否简要说明一下在Java中正确实现属性的困难之处?对于不太了解的人来说。 - Jason

11
任何事情默认都是"未完成"状态,因此不需要特别的理由使某件事保持未完成状态。相反,需要一些强有力的理由将某个事物从"未完成"移动到"计划中"或"已完成"。对于这种语言特性,尚未出现足够强有力的理由。

5

有两个原因需要避免在任何语言中使用属性:

  • 属性不太符合面向对象的思想。让它们易于编写会鼓励对象仅提供其内部状态并使调用者对其进行操作。对象应该提供更高级别的方法并保持其内部私有。下次你在枯燥地实现一个getter时,请考虑调用者将如何处理数据以及是否可以直接提供该功能。

  • 属性通过setter鼓励可变状态,这使得程序难以并行化。随着核心数量的增加,我们应该尝试使对象不可变以使并发推理更容易。下次你在枯燥地实现一个setter时,请考虑删除它并使对象不可变。


3
我反对 "属性不太面向对象"。其他人也这么说:"对象"是数据结构,包含数据字段(通常称为属性)和代码过程(通常称为方法)。(http://en.wikipedia.org/wiki/Object-oriented_programming)。按定义强制API/类/对象的用户忽略一半的内容是不方便的。这既不自然又会膨胀代码:`person.name = "Nimoy";person.setName("Nimoy");,以及name = person.name;name = person.getName();`。 - Gerold Broser
2
我建议避免使用“不太面向对象”的说法(这在这一点上几乎没有意义),但保留两个关键点(它们都是关于良好设计的,简单明了)。否则读者会把注意力集中在他们自己对面向对象编程的定义上,而忽略了这里真正想表达的内容。 - tne

3
  • 时间不够了?
  • 还没有正确规划?
  • 由于Java的实现方式,很难添加?
  • 被认为不够重要,即其他事情有更高的优先级?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接