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
朋友,害羞和陌生人。朋友
应该能够创建害羞
,但是陌生人
应该不能
此代码将编译:
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
才能被其他类访问,只是不能被实例化?为什么不打包私有构造函数?我不同意这个答案。如果构造函数受到保护,这意味着扩展它的类仍然可以调用构造函数。