C#具有自动属性,可大大简化您的代码:
public string Name { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
而Java你写了这么多代码:
private String name;
private String middleName;
private String LastName;
public String Name(){
return this.name;
}
etc..
有没有特殊原因Java没有实现这样的东西?
答案 0 :(得分:20)
答案 1 :(得分:17)
向现有编程语言添加新功能并不容易,特别是如果您关心向后兼容性。 Sun一直非常谨慎地为Java添加新功能,因为他们希望绝对确保任何新的语言功能都不会破坏多年来编写的数百万个Java程序。
所以,这不仅仅是将这个添加到语言中的问题;你必须仔细思考并尝试一下,以发现你想要添加的任何新功能是否存在任何细微的向后兼容性问题。
有人建议在Java中以某种形式添加对属性的支持,但对于Java 7(下一个版本即将发布)来说,这似乎不是正在考虑的功能。
您可能希望查看Project Lombok,这是Java的一种扩展,使用注释,可以编写更简洁的代码(例如,它可以自动生成getter和setter对于领域)。
答案 2 :(得分:3)
自动属性基于属性构建。
C#中的属性是一种语言特性,在Java中它们是一种约定(以get或set开头的方法通常被人们视为代码的属性,但对于编译器来说它与foo或bar没有区别。)
.NET及其相关语言,其中有很多方面基于COM(有时候会跟随,有时故意不在COM中做某事由于某种原因或其他不受欢迎的事情)。
COM有一个属性概念,在VB中由语言特性支持(在C ++中它由约定支持)。
VB的早期版本,特别是在用于提供从其他地方提供的对象模型的基本编程访问的上下文中,旨在简化呈现给用户的对象模型,以区分字段和获取或设置的方法(也许还有额外的工作,也许不是)不重要(考虑到虽然它们在.NET中与外部有一些重要的区别,但在语法上访问属性和公共字段是相同的)。当VB和COM(以及之前的OLE)长大后,他们一起长大。
总而言之,虽然C#与Java共享C / C ++继承,但它也有一个Java不共享的继承,这使得属性对于C#的创建者来说似乎是一个好主意,而不是Java的。
编辑:起初我说:
就个人而言,我认为自动属性实际上是解决属性缺陷的一种方法,而不是简化代码的方法。属性在语法上“看起来”像公共字段,但不完全(尝试使用DataBinder.Eval
来检索字段)。如果一个属性都是完全公开的,并且在getter或setter中没有其他功能(自动属性就是这种情况),我宁愿只有一个公共字段(封装在这里没有参数,因为它完全暴露它 - 无论如何都要传递,但是字段和属性之间的差异与此相反。
我收回了这句话。使字段与属性完全相同,需要简单的Plain-Old-Data结构字段作为属性,这将是一个松散的性能。从概念上讲,我希望他们彼此更加相似,但每当我想到它时(我已经厌倦了,不再像这里一样“等待”),它会更好。
答案 3 :(得分:2)
出于同样的原因,C#2.0或更低版本没有这个。它更像是语法糖,而不是语言特征。有很多这样的功能可以添加到任何语言,但没有人知道为什么他们不是语言。
答案 4 :(得分:1)
.net在Java之后出现,其目标之一是与COM进行互操作。 COM有属性,可能是一个VB,所以.net除了必须添加它们以使语言可以互操作之外。 (那,他们是一个非常漂亮的想法。)
Java没有这样的需求,它的创建者可能不想污染“=”的含义或者让函数调用看起来像成员变量。 (他们是 - 或者至少在某种程度上 - 在保持语言尽可能干净方面很重要。)他们的方法是Java bean规范,它为getter和setter指定了命名约定。了解规范的IDE可以或多或少地将getter和setter的视图作为设计目的的单个“属性”捏造。