【问题标题】:How can I make fields in nested class real private?如何使嵌套类中的字段真正私有?
【发布时间】:2015-01-15 20:41:39
【问题描述】:

我有一个带有 private 字段的嵌套(静态)类和该字段的 setter 方法。

public class Outer{
    private static class Inner{ // List node
        private String fieldA;

        // ...other members...

        public void setA(String fieldA)
        {
            //.. do importent stuff before setting fieldA
            this.fieldA = fieldA;
        }
    }
}

现在我们遇到了一个错误,因为尽管字段 fieldA 是 private,但 Outer 类直接(而不是通过 setter 方法 setA)访问了 fieldA。如何强制开发人员使用 setter 方法而不是直接访问该字段?

我已阅读相关主题Access modifiers inside a private static nested class in Java,该主题声明它是设计使然。但是是否有解决方法来确保外部类使用 setter 方法?

【问题讨论】:

  • 它必须嵌套吗?我认为这可能是问题所在 - 因为它是嵌套的,外部代码可以访问该变量。如果你把那个嵌套类去掉,它会按照你想要的方式运行。
  • 我可以把它搬出去。但是这个包中的所有其他类都会看到这个(以前的嵌套)类。但是嵌套类只被外部类使用。

标签: java nested-class java-6


【解决方案1】:

如果不能将类移到Outer 之外,您应该为Inner 定义一个接口并仅使用它。如果您只有少数实例并且这不是应用程序的性能关键点,您可以创建该接口的匿名实现。该类不再是静态的,但至少它是一个简短易读的解决方案。

private static interface Inner {
    void setA(String a);
}

private  static Inner createInner() {
    return new Inner() {
        private String a;

        @Override
        public void setA(String a) {
            this.a = a;
        }
    };
}

如果你想让类保持静态,我看不到很多选项可以隐藏外部类的任何内容。您可以尝试更清楚地表明应谨慎使用内部类。

看起来有点奇怪,但是你可以像下面的例子那样把实现移到接口中——这并不能真正阻止任何人使用Inner.InnerImpl,但它应该暗示InnerImpl类属于@ 987654326@,不能直接使用。

public class Outer{

    private static interface Inner {

        static class InnerImpl implements Inner {

            private String a;

            @Override
            public void setA(String a) {
                this.a = a;
            }
        }

        void setA(String a);

    }

    // either instantiate directly or again wrap it in a `createInner()` method 
    // Inner inner = new Inner.InnerImpl();
}

其实这里还有一个很简单的选择。我认为对于这种特殊情况,您可以证明引入新的命名约定以避免意外使用属性是合理的。

private static class Inner {

    private String _a;

    public void setA(String a) {
        this._a = a;
    }

}

【讨论】:

  • 为您的创造力+1。所有的建议都是好主意。但最后一个是最好的。不像其他人那么安全,但可读性很好。谢谢。
  • 是的,我也这么认为。如果太复杂,只会造成更多的混乱。 保持简单,愚蠢 :)
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 2013-03-06
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多