Java中缺少属性语法

C#具有声明和使用属性的语法。 例如,可以声明一个简单的属性,如下所示:

public int Size { get; set; } 

还可以在属性中添加一些逻辑,如下所示:

 public string SizeHex { get { return String.Format("{0:X}", Size); } set { Size = int.Parse(value, NumberStyles.HexNumber); } } 

无论是否具有逻辑,属性的使用方式与字段相同:

 int fileSize = myFile.Size; 

我对Java或C#并不陌生 – 我已经使用了很多,而且我总是错过了Java中的属性语法。 我已经在这个问题中读到“在Java 7或者可能永远都不会添加属性支持”,但坦率地说,我发现在讨论,论坛,博客,评论和JSR中挖掘它们需要做太多工作才能找到答案。为什么。

所以我的问题是:任何人都可以总结为什么Java不太可能获得属性语法?

  • 是因为与其他可能的改进相比,它被认为不够重要吗?
  • 是否存在技术(例如与JVM相关)的限制?
  • 这是政治问题吗? (例如“我已经用Java编写了50年的代码,我说我们不需要steenkin’属性!”
  • 是自行车的情况吗?

我认为这只是Java对事物的一般哲学。 属性有点“神奇”,Java的理念是尽可能简化核心语言,避免像瘟疫一样的魔法。 这使Java成为一个几乎任何程序员都能理解的通用语言 。 它还可以很容易地推断出任意隔离的代码片段正在做什么,并且能够提供更好的工具支持。 缺点是它使语言更冗长,更少表达。 这不一定是设计语言的正确方法或错误方法,这只是一种权衡。

在10年左右的时间里,sun尽可能地抵制语言的任何重大变化。 在同一时期,C#已经通过一个引人注目的开发,在每个版本中添加了许多新的酷炫function。

我认为很久以前火车离开了java中的属性,它们会很好,但是我们有java-bean规范。 现在添加属性只会使语言更加混乱。 虽然javabean规范IMO远没有那么好,但它必须要做。 在宏伟的事物计划中,我认为物业并不是那么相关。 java代码中的膨胀是由getter和setter之外的其他东西引起的。

还有更重要的事情要关注,例如获得一个体面的关闭标准。

C#中的属性语法只不过是语法糖 。 你不需要它,它只是为了方便。 Java人不喜欢语法糖。 这似乎足以让它缺席。

可能的论据只基于我不知情的观点

  • C#中的属性语法是一个丑陋的黑客,它将实现模式与语言语法混合在一起
  • 这不是必要的,因为它相当微不足道。
  • 它会对基于代码行支付的任何人产生不利影响。

我实际上喜欢那些属性的语法糖,因为整个语法往往会混淆代码,这在概念上非常简单。 Ruby似乎没有太大惊小怪。

另外,我实际上试图编写一些没有属性访问权限的中型系统(几十个类),这只是因为减少了混乱和代码库的大小。 除了不安全的设计问题(我愿意在这种情况下捏造)这几乎是不可能的,因为每个框架,每个库,java中的每一切都通过get和set方法自动发现属性。他们和我们一起直到非常时间的结束,有点像小的语法训练轮。

添加到Java可能很有用,但它可能不像闭包那样高。

就个人而言,我发现一个体面的IDE使这个问题没有实际意义。 IntelliJ可以为我生成所有的getter / setter; 我所要做的就是将你所做的行为嵌入到方法中。 我认为这不是一个交易破坏者。

我承认我对C#并不了解,所以也许那些将会推翻我的人。 这只是我的看法。

我会说它反映了语言变化的缓慢。 正如之前的一位评论者所提到的,现在大多数IDE都没有那么重要。 但是没有JVM特定的理由让它不在那里。

如果我不得不猜测,我会说它与语法糖的哲学反对意见较少(他们添加了自动装箱,增强了循环,静态导入等 – 所有糖)而不是向后兼容性的问题。 至少到目前为止,Java人员已经非常努力地设计新的语言function,以便保持源级向后兼容性(即为1.4编写的代码仍然可以编译和运行,无需在5或6中进行修改或超越)。

假设他们引入了属性语法。 那么,以下是什么意思:

 myObj.attr = 5; 

这取决于你是在讨论在添加属性特性之前或之后编写的代码,还可能是关于类本身的定义。

我并不是说这些问题无法解决,但我怀疑它们是否能够以一种导致清晰,明确的语法的方式解决,同时保留与以前版本的源兼容性。

python人员可能会破坏旧代码,但这不是Java的方式……

这与他们不改变Java中的任何其他内容的原因相同 – 向后兼容性。

– 是否因为与其他可能的改进相比,它被认为不够重要?

这是我的猜测。

– 是否存在技术(例如与JVM相关)的限制?

没有

– 这是政治问题吗? (例如“我已经用Java编写了50年的代码,我说:我们不需要steenkin’属性!”)

最有可能的。

– 这是自行车的情况吗?

呃?

Java的主要目标之一是保持语言简单。

来自: 维基百科

Java为了简化语言并防止可能的错误和反模式设计而抑制了类的几个function。

以下是一些逻辑,对我来说,导致不喜欢某种语言的属性:

一些编程结构被使用是因为它们存在,即使它们支持错误的编程实践。

塞特斯意味着可变对象。 稀疏地使用的东西。

好的OO设计你要求对象做一些业务逻辑。 属性意味着您要求它自己处理数据和操作数据。

虽然你可以覆盖setter和getters中的方法,但很少有人这样做; 最终的公共变量也与getter完全相同。 所以,如果你没有可变对象,那就是一个有争议的问题。

如果您的变量具有与之关联的业务逻辑,则逻辑应该通常与变量一起位于类中。 如果它没有,为什么在世界上它是一个变量??? 它应该是“数据”并且处于数据结构中,因此可以通过通用代码进行操作。


我相信Jon Skeet指出C#有一种处理这种数据的新方法,数据应该是编译时输入但不应该是变量,但是我的世界与C#世界的交互很少,我我只想说他的话很酷。

此外,我完全接受,根据您的风格和您与之交互的代码,您必须时不时地设置/获取情况。 我仍然平均每一个或两个一个setter / getter,但还不足以让我觉得新的编程结构是合理的。

请注意,我对工作和家庭编程的要求非常不同。 对于我的代码必须与其他20个人的代码交互的工作,我认为结构更明确,更好。 在家里Groovy / Ruby很好,属性也很棒等等。

根据Core Java的第2卷(忘记作者,但它是一本非常受欢迎的书),语言设计者认为隐藏字段访问语法背后的方法调用是一个糟糕的主意,因此将其排除在外。

您可能不需要“获取”和“设置”前缀,使其看起来更像属性,您可以这样做:

 public class Person { private String firstName = ""; private Integer age = 0; public String firstName() { return firstName; } // getter public void firstName(String val) { firstName = val; } // setter public Integer age() { return age; } // getter public void age(Integer val) { age = val; } //setter public static void main(String[] args) { Person p = new Person(); //set p.firstName("Lemuel"); p.age(40); //get System.out.println(String.format("I'm %s, %d yearsold", p.firstName(), p.age()); } }