3

假设我有 3 个课程 class1class2并且class3.

我怎样才能让它class1只能由class2( class1 object = new class1()) 实例化,但不能由 class3 或任何其他类实例化?

我认为它应该与修饰符一起使用,但我不确定。

4

4 回答 4

2

我想将您的课程重命名为Friend,ShyStranger. Friend应该能够创造,ShyStranger不应该能够。

此代码将编译:

package com.sandbox;

public class Friend {

    public void createShy() {
        Shy shy = new Shy();
    }

    private static class Shy {

    }

}

但是这段代码不会:

package com.sandbox;

public class Stranger {

    public void createShy() {
        Friend.Shy shy = new Friend.Shy();
    }

}

此外,如果我们创建一个名为 的新类FriendsChild,这也不会编译:

package com.sandbox;

public class FriendsChild extends Friend {

    public void childCreateShy() {
        Shy shy = new Shy();
    }

}

当您考虑它时,这种命名约定是有意义的。仅仅因为我是某人的朋友并不意味着我的孩子认识他们。

请注意,所有这些类都在同一个包中。据我所知,这是您正在寻找的场景。

于 2013-01-16T19:43:43.740 回答
1

除了使构造函数受保护之外的另一个选择:

  • class1构造函数设为私有
  • 创建一个公共静态工厂方法,该方法需要一个有效的实例class2才能返回一个实例class1
于 2013-01-16T19:37:43.880 回答
0

使 class1 成为 class2 的内部类。

于 2013-01-16T19:38:41.947 回答
0

更新

制作protected构造函数并将符合条件的类放在同一个包中,如果您希望包外的任何类来构造此实例,那么您需要ClassA在此示例中扩展该类,

如果你限制它然后去default访问说明符

package com.somthing.a;
public class ClassA {

    ClassA() {
        super();
        // TODO Auto-generated constructor stub
    }
}

package com.something.a;
public class ClassB {
    public static void main(String[] args) {
        new ClassA();//valid
    }
}


package com.something.c;
public class ClassC {
    public static void main(String[] args) {
        new ClassA();// invalid
    }
}
于 2013-01-16T19:35:31.410 回答