24

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没有实现这样的东西有什么特别的原因吗?

4

5 回答 5

20

是的,因为它没有。俗话说,所有功能一开始都没有实现。

于 2010-08-07T04:37:30.190 回答
18

向现有编程语言添加新功能并不容易,尤其是在您关心向后兼容性的情况下。Sun 在向 Java 添加新功能时一直非常谨慎,因为他们希望绝对确保任何新的语言功能都不会破坏多年来编写的数百万 Java 程序。

因此,这不仅仅是将其添加到语言中的问题;您必须仔细考虑并尝试一下,以发现您要添加的任何新功能是否存在任何微妙的向后兼容性问题。

已经有人提议在 Java 中以一种或另一种形式添加对属性的支持,但对于 Java 7(即将推出的下一个版本)来说,这似乎不是一个正在考虑的特性。

您可能想看看Project Lombok,它是 Java 的一种扩展,使用注解,可以编写更简洁的代码(例如,它可以为字段自动生成 getter 和 setter)。

于 2010-08-07T05:34:44.533 回答
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 结构的字段像属性一样工作,这会导致性能松散。从概念上讲,我希望他们更像彼此,但每当我想到它时(我已经从恼火变成了不止一次像这里一样“哦等等”),这样就更好了。

于 2010-08-07T11:22:09.760 回答
1

.net 在 Java 之后出现,其目标之一是与 COM 互操作。COM 具有属性,可能是 VB,因此 .net 几乎必须添加它们以使语言可互操作。(那,他们是一个非常漂亮的主意。)

Java 没有这样的需求,它的创建者可能不想污染“=”的含义或让函数调用看起来像成员变量。(他们——或者至少在某些时候——非常重视保持语言尽可能干净。)他们的方法是 Java bean 规范,它指定了 getter 和 setter 的命名约定。出于设计目的,了解规范的 IDE 或多或少可以将 getter 和 setter 视为单个“属性”。

于 2010-08-07T04:50:43.610 回答
1

出于同样的原因,C# 2.0 或更低版本没有此功能。它更多是语法糖而不是语言功能。有很多这样的功能可以添加到任何语言中,但没有人知道为什么它们不是该语言。

于 2010-08-07T05:42:04.817 回答