使类只能从特定类中实例化

时间:2013-01-16 19:33:01

标签: java class modifier

我们说我有3节课 class1class2class3

我怎样才能使class1只能由class2class1 object = new class1())实例化,而不能由class3或任何其他类实例化?

我认为它应该适用于修饰符,但我不确定。

4 个答案:

答案 0 :(得分:2)

我想将您的课程重命名为FriendShyStrangerFriend应该能够创建Shy,但Stranger应该无法创建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(); } } 的新类,则此不会编译:

{{1}}

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

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

答案 1 :(得分:1)

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

  • 制作class1 constructer private
  • 创建一个公共静态工厂方法,该方法需要class2的有效实例才能返回class1的实例

答案 2 :(得分:0)

<强>更新

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

答案 3 :(得分:0)

make class1 class2的内部类。