【问题标题】:Class variable: public access read-only, but private access r/w类变量:公共访问只读,但私有访问 r/w
【发布时间】:2012-12-28 18:55:13
【问题描述】:

在我当前的项目中,我有一个将其实例存储在变量中的类。这个实例应该可以被项目中的所有其他类访问,但它只能被它自己的类改变。

我怎样才能做到这一点?

【问题讨论】:

  • “它的实例”是什么意思?该类只有一个实例吗? (单身)
  • 是的,我就是这个意思。

标签: java class-variables


【解决方案1】:

有人建议“私有领域的公共 getter 但没有公共 setter”。

注意:这仅在字段为原始类型时才有效。
如果是带setter的对象,内容还是可以修改的;因此不是只读的。

看到 Java 语言提供了一些结构来使返回类型成为只读而不需要进行深度复制/克隆,这将是一件很有趣的事情。

我想像 只读 getEmployee() { ...}

【讨论】:

    【解决方案2】:

    简而言之就是所谓的immutable objectObject的状态在构造之后就不能改变了。

    String 是不可变Class 的常见示例。

    通过以下方式创建class immutable-

    • 确保类不能是overridden - 使class final,或使用 static 工厂并保持构造函数私有。
    • 创建字段privatefinal
    • 强制调用者在一个步骤中完全构造一个对象, 而不是使用 no-argument constructor 与后续 调用setXXX 方法。
    • 不提供任何可以改变对象状态的方法 以任何方式 - 不仅仅是setXXX 方法,而是任何可以改变的方法 状态
    • 如果类有任何可变对象字段,那么它们必须是 在类与其调用者之间传递时进行防御性复制。

    【讨论】:

      【解决方案3】:

      可以在很多地方找到用于实例化单例的样板代码,例如参见http://www.javacoffeebreak.com/articles/designpatterns/index.html

      请注意,许多人认为单例是一种反模式,因为一旦您的应用程序中充斥着对单例的引用,就很难摆脱它。

      【讨论】:

        【解决方案4】:

        写一个public getter 但没有 public setter。还有字段本身private

        【讨论】:

        • 并且该字段的类型必须是不可变的。
        • 如果字段的类型不是不可变的,您始终可以返回它的深层副本而不是对其自身的引用,以确保该字段不能被其他人修改。
        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 2022-09-24
        • 2012-05-29
        • 2015-09-25
        • 1970-01-01
        • 2019-07-15
        • 2013-10-08
        • 1970-01-01
        相关资源
        最近更新 更多