Java有像C#中的“属性”吗?

时间:2011-10-31 21:46:50

标签: java properties

我理解这个问题与其他人询问Java Properties类似,这些问题的答案似乎是“不,你必须使用getter / setters”。

我搜索了类似C#的Java属性,但到目前为止只发现了一个“命中”。而且我不确定它是属性还是其他东西。

Reading the Java Tutorial,我偶然发现了一些文字和代码(**强调并评论我的):

Finally, you can use the built-in **length property** to determine the
size of any array. The code:

 //notice lack of brackets after anArray.length :
 System.out.println(anArray.length);

will print the array's size to standard output.

由于Array具有length属性,Java 确实具有属性,对吧?

有人可以指出一些关于它们的文档吗?

6 个答案:

答案 0 :(得分:2)

这实际上取决于您使用的定义。在不使用括号的情况下访问某些类的数据是“属性”的一个非常弱的定义。您可以将任何类/实例成员字段设置为公共,从而无需使用方法即可访问它。

没有使它像C#属性一样,你可以添加自定义逻辑来获取和设置在该字段上的完成情况!你直接读/写变量。数组的length字段不可写,实际上是不可变的,所以它不是可怕的样式。但是其他暴露其字段的类遇到了麻烦,例如PointDimension

答案 1 :(得分:1)

没有。没有关于它们的文档。不像C#,Groovy等那样真正的属性

JavaBean规范尽可能接近,这更多地与满足工具需求有关;它仍然只是吸气剂,制定者和命名惯例。

“长度”有些异常,以及有关如何实现数组的其他内容。

答案 2 :(得分:1)

Java对象可以具有属性,您可以将其视为一种属性,并且它们也可以具有方法。但是,C#领域中的“属性”意味着特定的东西,而Java则没有。

当然,Java可以使用其他功能模仿它们。

答案 3 :(得分:1)

在Java中,公共成员变量可以被视为属性,但它们只是简单的属性;没有办法提供getter / setter方法来拦截他们的读/写。例如:

class Foo {
  public String name;
}
Foo f = new Foo();
f.name = "Alice";
f.name; // "Alice"

只要您提供具有赋值(或默认值)的构造函数,您也可以将它们设置为“只读”:

class Bar {
  public final String name;
  public Bar(String name) { this.name = name; }
}
Bar b = new Bar("Bob");
b.name; // "Bob"
b.name = "Carol"; // Compile Error: cannot assign to final field.

答案 4 :(得分:1)

没有

Java使用JavaBeans规范(粗略地说:getter和setter)来实现这一目标。

答案 5 :(得分:1)

Java原始对象有一些你可能认为是“属性”的东西,因为它们被指定为variableName.someName而不是variableName.someName()length(对于一个数组)是一个(也是我目前唯一能想到的)。然而,在一些手法中,它们在规范中被称为“字段”,即使它们没有在所有类似字段中实现。

它们都是只读的。