【问题标题】:Is it OK to use Java final variables like .NET read only properties?使用像.NET只读属性这样的Java最终变量可以吗?
【发布时间】:2012-09-05 17:34:09
【问题描述】:

因为你不能设置最终变量的值(我假设),比如数组的长度。

Object[] items = new Object[10];

//Not allowed
Object.length = 3;

是否可以将其用作班级中的只读字段。

【问题讨论】:

    标签: java .net


    【解决方案1】:

    这取决于您所说的“OK”是什么意思。不能更改items.length 的原因是length 是只读字段;创建数组后,它的大小是固定的。无论items 是否声明为final,您指定的“不允许”行都是无效的。

    重要的是要理解将items 设为final 变量只是意味着您将无法更改变量的值以引用不同的数组。变量值是一个引用,不是数组本身。您无法更改变量引用的数组,但您仍然可以更改数组的内容:

    // Entirely valid...
    items[0] = new Object();
    

    如果你想要真正不可变的东西,你不能使用数组。

    【讨论】:

    • +1 空数组是不可变的,但一个或多个数组是可变的。
    【解决方案2】:
    C# 中的

    readonly 和 java 中的 final 大致相同(至少在应用于字段时)。每当您将字段标记为 final 时,编译器将不允许您在通过变量初始化或通过对象构造函数分配后修改其引用。

    但是它不会阻止你修改你引用的对象的内容,做这样的事情:

    public class Person {
       public final String name;
       public final Address address;
    
       public Person(String name, Address address) {
           this.name = name;
           this.address = address;
       }
    }
    
    //Someplace else
    Person peter = new Person("peter", new Address("Dolphin Cove 993", "Stamford", "CT");
    peter.address.state = "CA"
    

    即使“地址”字段是最终的,它也是完全有效的。

    另外,不要依赖 final 来构建任何类型的“安全性”或对某些值的强访问限制,因为它很容易通过反射被打破。 (http://stackoverflow.com/questions/4516381/changeing-private-final-fields-via-reflection)

    可能不需要所有这些澄清,但有人可能会发现它很有用

    干杯, 克劳迪奥

    【讨论】:

      【解决方案3】:

      有些人喜欢将所有实例变量保持私有并使用“getter”,例如getLength() 方法,但这真的是个人喜好。公共最终字段没有任何明确的错误;这只是风格。就个人而言,我有时会将它们用于非常简单的类。

      【讨论】:

      • 如果公共最终字段持有对可变对象的引用,那么它可能是错误的。在这种情况下,Getter 返回不可变视图或对象副本是唯一的方法。
      • 当然,但也可能是封闭类与其他引用其实例数据的人完全一致,即使它是可变的。完全取决于用例。
      【解决方案4】:

      当然,因此将其公开为只读的方法是将成员变量“items”保留在您的类中私有并公开一个公共 getter 方法。比如:

      public int getNumItems() {
          return (items == null ? 0 : items.length); //includes null handling using ternary operator
      }
      

      【讨论】:

        猜你喜欢
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        相关资源
        最近更新 更多