如何使嵌套类中的字段真正私有?

时间:2014-11-18 15:36:06

标签: java nested-class java-6

我有一个嵌套(静态)类,其中包含私有字段和此字段的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;
        }
    }
}

现在我们遇到了一个错误,因为虽然字段setA私有<,但是外部类直接(而不是通过setter方法fieldA) / em>的。如何强制开发人员使用setter方法而不是直接访问字段?

我已阅读相关主题Access modifiers inside a private static nested class in Java,声明这是设计原因。但有没有一种解决方法可以确保使用外部类的setter方法?

1 个答案:

答案 0 :(得分:3)

如果不能将类移到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,但它应该意味着类{{1} }属于InnerImpl,不能直接使用。

Inner

实际上这是另一个非常简单的选择。我认为对于这种特殊情况,您可以证明引入新的命名约定以避免意外使用属性。

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();
}