gpt4 book ai didi

java - 如何使嵌套类中的字段真正私有(private)?

转载 作者:行者123 更新时间:2023-11-29 05:14:42 24 4
gpt4 key购买 nike

我有一个嵌套(静态)类,它有一个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;
}
}
}

现在我们有一个错误,因为字段 A 被外部类直接访问(而不是通过 setter 方法 setA),尽管字段 fieldA私有(private)的。如何强制开发人员使用 setter 方法而不是直接访问该字段?

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

最佳答案

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

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

如果你想保持类静态,我没有看到很多选项可以对外部类隐藏任何东西。您可以尝试使其更加明显,应该谨慎使用内部类。

它看起来有点奇怪,但您可以像下面的示例那样将实现移到接口(interface)中 - 这并不能真正阻止任何人使用 Inner.InnerImpl,但它应该暗示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();
}

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

private static class Inner {

private String _a;

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

}

关于java - 如何使嵌套类中的字段真正私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com