Has*_*eon 50 java oop constructor design-patterns access-modifiers
我的第一个问题是 -
class Explain() {
public Explain() {
}
}
Run Code Online (Sandbox Code Playgroud)
构造函数是否应始终声明为公共?
如果我创建一个private构造函数怎么办?
我总是看到构造函数是隐含的public.那么为什么private构造函数有用呢?或者根本没用.因为没有人可以调用它,或者从不创建对象(因为private构造函数)!这是我的第二个问题.
Dha*_*uka 78
不,构造函数可以是public,private,protected 或default(没有访问修饰符的话).
制造东西private 并不意味着没有人可以访问它.这只意味着班上没有人可以访问它.所以private构造函数也很有用.
private构造函数的一个用途是提供单例类.单例类是将对象创建的数量限制为一个的类.使用private构造函数,我们可以确保一次只能创建一个对象.
示例 -
public class Database {
private static Database singleObject;
private int record;
private String name;
private Database(String n) {
name = n;
record = 0;
}
public static synchronized Database getInstance(String n) {
if (singleObject == null) {
singleObject = new Database(n);
}
return singleObject;
}
public void doSomething() {
System.out.println("Hello StackOverflow.");
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
Ana*_*mar 10
是的,构造函数可以具有任何访问说明符/访问修饰符.
私有构造函数对于创建singleton类很有用.
Singleton - 单例类是一个只能在运行时创建单个对象的类(每个JVM).
单例类的一个简单例子是 -
class Ex {
private static Ex instance;
int a;
private Ex() {
a = 10;
}
public static Ex getInstance() {
if(instance == null) {
instance = new Ex();
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
注意,对于上面的类,获取对象(在此类之外)的唯一方法是调用getInstance()函数,该函数只创建一个实例并继续返回该实例.
另请注意,这不是线程安全的.
小智 5
没有规则将构造函数公开.通常我们将它定义为public只是因为我们想要从其他类中实例化它.
私有构造函数意味着"除了我,我不会让任何人创建我的实例".所以通常你会喜欢有单身模式.
以下是JDK中使用私有构造函数的类.
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
// Don't let anyone else instantiate this class
private Runtime() {
}
}
Run Code Online (Sandbox Code Playgroud)
不,构造函数可以使用任何访问修饰符,包括私有.(私有构造函数意味着只有类本身的代码可以实例化该类型的对象,因此如果私有构造函数类想要允许使用该类的实例,则该类必须提供允许访问的静态方法或变量从类中创建的实例.)
例
class Alpha {
static String s = " ";
protected Alpha() { s += "alpha "; }
}
class SubAlpha extends Alpha {
private SubAlpha() { s += "sub "; }
}
public class SubSubAlpha extends Alpha {
private SubSubAlpha() { s += "subsub "; }
public static void main(String[] args) {
new SubSubAlpha();
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
上述计划的输出将是
alpha子包
| 归档时间: |
|
| 查看次数: |
27742 次 |
| 最近记录: |