Java和C#类似的属性

16

Java原生支持像C#中的属性吗?还是在Java编程时,当尝试封装变量时,只能通过getVariable()setVariable()这种方法来实现?

谢谢

5个回答

18

不行

在Java语言中没有属性的概念。需要使用getter和setter方法。


2
几乎:你没有语言级别的支持,但是属性在Java Beans规范中是一个明确定义的概念,并通过它们的getter/setter进行定义。 - Joachim Sauer
2
谢谢你的补充,不过我假设我们在讨论这个问题中是指Java语言。 - stiank81
1
我同意这个假设。但是,我仍然希望避免给人留下在整个Java(平台)中没有像属性这样的东西的印象。虽然Java(语言)不支持它,但在平台上并不是未知的事情。 - Joachim Sauer

4

Java不支持类似于C#的属性。您需要使用getter和setter,但要注意不要意外地通过返回对象的引用而不是其副本的引用来让用户访问封装的数据。


你在倡导这样的代码: Object x = something.getX(); if(x.equals(something.getX())) { // 不可能发生 } - brian
嗯,我明白了。那么当从getter返回变量时,我是否应该始终进行深拷贝? - devoured elysium
2
不行,只有在外部更改是不安全的情况下才能这样做。问题在于,对于像“int”这样的原始类型,您可以只创建一个getter而没有setter来保护您的变量。但是,如果您从getter返回引用类型(例如集合),则该对象的内部状态可以在外部进行操作(例如member.getFriends().clear())。如果您无法承受这种情况,请返回副本(或只读包装器)。 - Ekin Koc
2
这与C#和Java属性有什么关系?对于任何返回值来说,这不是常识吗? - Dykam
2
C#属性只是getter和setter方法的语法糖。在这方面与Java没有区别(除了代码更好10倍)。你说得对,无论你如何获取它们,任何类型的返回值都适用于相同的规则。 - Ekin Koc

4

正如其他人所说,Java本身没有属性。通常的方法是使用getter和setter。另外一方面,Delphi支持类似于C#的属性。

在Java中绝对不支持AutoProperties。似乎也找不到任何未来将支持它的提及。


2

我上次查询时,Java并不支持属性。


0

C# 属性与 Delphi 属性类似,这是因为它们受到了 Delphi 属性的启发。 当然,Borland 的 Delphi 团队中的关键人物转投微软并设计 C#,这两者之间并没有任何联系 :)

去年有一个提案(实际上有几个)想要将 C# 风格的属性添加到 Java 中,但由于被视为只是纯粹的语法糖,没有真正的附加价值,所以最终遭到社区的抵制。


说实话,我相当喜欢C#中的属性,但我可以理解为什么它可能会导致问题,因为在调用代码中无法区分访问成员和其getter/setter。 例如,如果我有一个派生类,我可能希望在某些情况下绕过getter/setter并直接访问类成员,例如在重写的getter或setter中或出于性能原因。 - jwenting
2
在许多情况下,简单的getter和setter似乎会使类所需的代码行数翻倍。 - Jon Onstott

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