Java 使类仅可从特定类实例化

Java 使类仅可从特定类实例化,java,class,modifier,Java,Class,Modifier,假设我有三节课 class1,class2和class3 我怎么能让class1只能被class2(class1 object=new class1())实例化,而不能被class3或任何其他类实例化 我认为它应该与修改器一起工作,但我不确定。更新 使protected构造函数并将符合条件的类放在同一个包中,如果您希望包外的任何类构造此实例,则在本例中,您需要该类扩展ClassA 如果您限制它,则选择defaultaccess说明符 package com.somthing.a; public

假设我有三节课
class1
class2
class3

我怎么能让
class1
只能被
class2
class1 object=new class1()
)实例化,而不能被class3或任何其他类实例化


我认为它应该与修改器一起工作,但我不确定。

更新

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

如果您限制它,则选择
default
access说明符

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

除了保护构造函数之外,还有另一种选择:

  • class1
    构造函数设为私有
  • 创建一个公共静态工厂方法,该方法需要一个有效的
    class2
    实例,以便返回
    class1

将class1作为class2的内部类。

我想将您的类重命名为
朋友
害羞
陌生人
朋友
应该能够创建
害羞
,但是
陌生人
应该不能

此代码将编译:

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

}
此外,如果我们创建一个名为
Friendshild
的新类,则该也不会编译:

package com.sandbox;

public class FriendsChild extends Friend {

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

}
仔细想想,这种命名惯例是有道理的。仅仅因为我是某人的朋友并不意味着我的孩子认识他们


请注意,所有这些类都在同一个包中。据我所知,这就是你想要的场景

你是否需要
class1
才能被其他类访问,只是不能被实例化?为什么不打包私有构造函数?我不同意这个答案。如果构造函数受到保护,这意味着扩展它的类仍然可以调用构造函数。