单例模式可被内部 class 破坏?

Singleton-pattern destroyable by inner class?

我按照单例模式写了一个 class,接下来想为它写一个内部 class。 让我担心的是内部 class 能够访问所有外部 classes 私有字段,包括单个实例的私有字段,我想私有构造函数也是如此。

当一个人可以访问内部 class 的构造函数时,是否有可能攻击单例并创建它的第二个实例?

我正在考虑从内部 class 的实例导航到 class 的构造函数。 例如:

class Outer{

    private static Outer instance;
    private Outer(){}
    public static Outer getInstance(){
    if(instance==null)instance= new Outer();
    return instance;
    }

    class Inner{
    public Inner(){}

}

现在是这样的:

public class Main{

    public static void main(String[]args){
    Outer outer = Outer.getInstance();
    Inner inner = outer.new Inner();
    Outer outer2 = inner.Outer.this.new Outer();
    }

}

注意到最后一行是不可编译的,我认为一旦拥有内部 class.

您的问题似乎表明您正试图阻止攻击者对您的源代码进行特定更改。如果有人已经拥有该级别的访问权限,那么地球上没有任何安全措施可以保护您免受攻击。

What worries me is that the inner class is able to access all of the outer classes private fields, including the private field for the single instance and i suppose the private constructor likewise.

这就是 inner class 生活的全部目的,阅读更多 here,inner classes 是为你想保持 [=] 的某种状态而设计的27=] 是私有的,但仍然需要一个内聚的 class 来访问它,所以在这种情况下,你为那个顶层 class.

创建一个内部 class

Is it possible to attack the singleton and to make a second instance of it when one has access to the constructor of the inner class?

如果您已经为您的顶级 class 实施了正确的单例模式,那么没有人可以创建您的顶级 class 的另一个实例。

此外,以防万一,如果您有其他想法,那么当您创建内部 class 的实例时,它不会创建外部 class 的实例,不会再出现这种情况就像如果你有一个静态内部 class 那么你确实需要一个顶级实例 class 但是如果你有一个非静态内部 class 那么首先你需要创建一个顶级实例级别 class 然后创建内部 class、 的实例,但重点是创建内部 class 的实例不会创建外部 [=] 的另一个实例27=],所以如果你在我们的外部 class 中正确实现了单例模式,那么你就没问题。

我建议您阅读有关内部 classes here.

的内容

Singleton-pattern destroyable by inner class?

通过上面的解释,答案是否定的,在顶层 class 中正确实现的单例模式,它的内部不能创建顶层的另一个实例 class。