【问题标题】:Does Java have "properties" like in C#? [duplicate]Java 是否具有像 C# 中的“属性”? [复制]
【发布时间】:2011-12-19 02:17:36
【问题描述】:

我知道这个问题与其他人询问 Java 属性的问题类似,这些问题的答案似乎是“不,你必须使用 getter/setter”。

我搜索了类似 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 确实 有属性,对吧?

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

【问题讨论】:

标签: java properties


【解决方案1】:

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

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

【讨论】:

  • 啊..我检查了,length 被声明为public final int length。还有getLength()。我想由于一些便利因素,该字段被公开,因为数组的大小一旦存在就无法更改,因此他们决定将其公开为“常量”。 Java 教程的作者不应该使用“属性”这个词!
  • @Zabba: getLength() 如果您有对数组的引用,则不会公开。 Object[] arr...; arr.getLength() 无法编译。
  • @Zabba:该教程是在 .NET/C# 甚至存在之前编写的,所以我不确定你是否能找到它们的错误 ;-)。并不是 .NET 发明了这个术语。
  • 也许 :) - 但该教程也已针对 Java 7 进行了更新。此外,C# 的属性在 Delphi/C++ Builder 中已经存在很长时间了 :) 我确实在文档中看到了getLength(),但没有尝试编译。谢谢!
【解决方案2】:

没有。没有关于它们的文档。不是 C#、Groovy 等中的 真实 属性。

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

“长度”有点反常,还有其他关于如何实现数组的内容。

【讨论】:

  • 异常...是的 - 尝试向纯 Java 程序员解释如何在 C++ 中拥有map["foo"],它不是数组,而是映射。
  • @glowcoder:这不是更多地与运算符重载有关,而不是 Java 的数组实现吗? :-P
  • @Mark 绝对是。但这也是 Java 获得这种特殊处理的唯一方面,因此是异常的。我想字符串的 + 和 += 运算符也得到了类似的处理。
【解决方案3】:

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

当然,Java 可以用其他特性模仿它们。

【讨论】:

    【解决方案4】:

    在 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.
    

    【讨论】:

      【解决方案5】:

      没有。

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

      【讨论】:

        【解决方案6】:

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

        它们都是只读的。

        【讨论】:

        • 我能想到的另一个“属性”,甚至比length 更脆弱,是class,用于附加到类名(例如,Hashtable.class)以返回 java.lang .Class 对象为类名。我想可能还有一两个其他的,但我怀疑我必须检查 Java 语法图才能找到它们。
        猜你喜欢
        • 2011-02-27
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 2020-06-21
        • 1970-01-01
        • 2017-05-16
        相关资源
        最近更新 更多