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

3
我知道这个问题类似于其他关于Java属性的问题,那些问题的答案似乎是“不,你必须使用getter/setter”。
我搜索了类似于C#的Java属性,但目前只找到一个“命中”。而且我不确定它是属性还是其他什么东西。
阅读Java教程时,我遇到了一些文本和代码,其中说(**强调和我的评论):
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确实有属性,对吗?

有人可以指出一些相关文档吗?


不,你必须使用getter/setter:这将是https://dev59.com/cnA85IYBdhLWcg3wCfLm - Raedwald
6个回答

2

这真的取决于你使用的定义。不使用括号访问某个类的数据是“属性”的一个非常弱的定义。您可以将任何类/实例成员字段公开,并因此可以在不使用方法的情况下访问它。

但这并不像C#属性一样,您无法为该字段添加自定义逻辑来处理获取和设置!您直接从/写入变量。数组的“length”字段不可写且实际上是不可变的,因此对于这样做并不是可怕的风格。但是其他公开其字段的类已经遇到了麻烦,比如PointDimension


啊..我检查了一下,length 声明为 public final int length。还有 getLength()。我想这个字段被公开是因为某种便利因素,因为数组的大小一旦存在就不能更改,所以他们决定将其公开为“常数”。Java 教程的作者不应该使用术语“属性”! - Zabba
@Zabba:如果您有一个数组的引用,则无法公开getLength()Object [] arr ...; arr.getLength()无法编译。 - Mark Peters
1
@Zabba: 那篇教程是在.NET/C#出现之前撰写的,所以我不确定你能否责怪他们;-)。并不是说.NET创造了这个术语。 - Mark Peters
1
也许吧 :) - 但是那个教程已经更新了一些Java 7的内容。此外,C#拥有的属性在Delphi/C++ Builder中早就存在了 :) 我在文档中看到了getLength(),但没有尝试编译。谢谢! - Zabba

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.

1

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

JavaBean规范是最接近的,但这更多地涉及满足工具需求;它仍然只是getter,setter和命名约定。

“长度”有些异常,以及有关数组实现方式的其他一些事情。


异常……是的——试着向一个只会Java的程序员解释在C++中你可以有map["foo"],它不是数组,而是一个映射。 - corsiKa
@glowcoder:这不是更多与运算符重载有关,而不是Java数组的实现吗? :-P - Mark Peters
@Mark,确实如此。但这也是Java中唯一受到特殊对待的方面,因此是异常的。我想字符串也通过其+和+=运算符接受了类似的处理。 - corsiKa

1

Java对象可以拥有属性,你可以将其视为一种属性类型,它们也可以拥有方法。然而,在C#领域中,“属性”意味着特定的东西,而Java没有。

当然,Java可以通过其他功能来模拟它们。


1

不。

Java使用JavaBeans规范(大致上是:getter和setter)来实现这一点。


1

Java的原始对象具有一些你可能视为“属性”的东西,因为它们被指定为variableName.someName而不是variableName.someName()length(对于数组)是其中之一(也是我目前唯一能想到的)。但是,在规范中它们被称为“字段”,尽管它们根本不像字段那样实现。

它们全部都是只读的。


我能想到的另一个比length更加牵强的“属性”是class,它用于追加在类名后面(例如Hashtable.class),以返回该类名的java.lang.Class对象。我想可能还有一两个,但我得检查Java语法图才能找到它们。 - Hot Licks

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