为什么原生属性将不成为Java 7的一部分,有任何合理的理由吗?
原生属性是指Java中可以通过本地代码访问的系统级属性。
为什么原生属性将不成为Java 7的一部分,有任何合理的理由吗?
原生属性是指Java中可以通过本地代码访问的系统级属性。
这与课程安排和资源等高级原因有关。实现属性并理解所有影响和与其他语言特性的交集是一项庞大的任务,类似于各种Java 5语言更改的规模。
但我认为Sun没有推动属性的真正原因与闭包相同:
1)对于实现看法存在分歧,或者说,存在许多竞争性替代方案和对属性有不同看法的人,这些人在重要部分的实现上意见不一。
2)更重要的是,是否需要此功能存在显著的共识缺乏。虽然很多人想要属性,但也有很多人认为它不是必要的或者有用的(特别是服务器端的程序员们认为属性对他们的日常工作远不如Swing程序员重要)。
有关属性历史,请参见:
在Java中正确地处理属性并不容易。Rémi Forax的工作尤为宝贵,他找出了这可能是什么样子,并发现了很多必须处理的“陷阱”。
与此同时,Java 7已经太久了。闭包辩论是一个巨大且有争议的干扰,浪费了许多可以用来开发得到广泛支持的特性(如属性)的头脑能量。最终决定将主要变化限制在模块化(Project Jigsaw)上,只考虑对语言进行“小改动”(在Project Coin下)。
JavaFX具有美丽的属性支持,因此Sun显然了解属性的价值并知道如何实现它们。但是,由于JavaFX属性的赏心悦目,开发人员不太可能接受Java中半成品的属性实现。如果值得做,就值得做好。
有两个原因需要避免在任何语言中使用属性:
属性不太符合面向对象的思想。让它们易于编写会鼓励对象仅提供其内部状态并使调用者对其进行操作。对象应该提供更高级别的方法并保持其内部私有。下次你在枯燥地实现一个getter时,请考虑调用者将如何处理数据以及是否可以直接提供该功能。
属性通过setter鼓励可变状态,这使得程序难以并行化。随着核心数量的增加,我们应该尝试使对象不可变以使并发推理更容易。下次你在枯燥地实现一个setter时,请考虑删除它并使对象不可变。
与
person.setName("Nimoy");,以及
name = person.name;与
name = person.getName();`。 - Gerold Broser