我有一个嵌套(静态)类,其中包含私有字段和此字段的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
是私有<,但是外部类fieldA
) / em>的。如何强制开发人员使用setter方法而不是直接访问字段?
我已阅读相关主题Access modifiers inside a private static nested class in Java,声明这是设计原因。但有没有一种解决方法可以确保使用外部类的setter方法?
答案 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();
}