//问题:将类的实例限制为一个。
class Runtime{
private static Runtime r;
private Runtime(){
System.out.println("In Runtime class.");
}
static{
r=new Runtime();
}
static Runtime getRuntime(){
Runtime r=new Runtime();
return r;
}
}
class TestRuntime{
public static void main(String[] args) {
Runtime r1;
r1=Runtime.getRuntime();
}
}
我想了解这段代码实际的作用,以及它如何限制对象的创建。 什么是其他可能的解决方案?优选地,该代码解决了该问题。
答案 0 :(得分:0)
您发布的代码似乎有问题。它不是单身人士。每次调用getRuntime()时,这都会创建一个新实例。相反,在getRuntime方法中,' r' (应在静态块中初始化)应直接返回。
如果您正在寻找单例模式,请查看以下实现。 https://en.wikipedia.org/wiki/Singleton_pattern#Lazy_initialization
答案 1 :(得分:0)
首先,您要问的是一个非常常见的问题。如此常见,它被称为“单身模式”,你可以搜索它,你会发现更多的信息。至于你的代码,它几乎是好的。将您的getRuntime()
方法更改为此方法就可以了(从r1=Runtime.getRuntime();
删除第getRuntime()
行)
static Runtime getRuntime(){
return r;
}
现在有两种主要的方法可以实现Singleton - Eager和Lazy。
答案 2 :(得分:0)
在JVM的引擎盖下,你无法真正地防止"创建一个类的多个实例。另一方面,您有时希望在代码中的任何位置使用相同的对象,这是非常常见的,因为拥有多个实例并没有意义。所以人们想出了"单身人士的想法。
在Java中,单身人士通过一种利用"静态"的技巧来实现。修改。通过将某些内容标记为" static",您可以告诉编译器您希望该类的所有实例共享一个副本。这使得每个类的字段而不是每个实例。因此,除非您使用自定义类加载器或类似的东西,否则这也意味着您在整个JVM中只有一个副本。
此外,您需要将构造函数设为私有,以便其他代码无法仅调用构造函数来创建另一个实例。
但是,你应该记住,这只是一个" cosmetical"编译器强制执行的限制。把它想象成一种好的编程方式。例如,人们仍然可以通过反射创建其他对象。
答案 3 :(得分:0)
真正的Singleton的一个非常基本的实现看起来像这样:
public class Runtime {
// a single(ton) instance to limit the instantiation to 1
private static Runtime runtimeInstance;
// a private constructor, not accessable from outside this class!
private Runtime() {
System.out.println("First creation of a Runtime instance.");
}
// the method that actually provides a single instance to callers
public static Runtime getInstance() {
// if the instance is not yet instanciated
if (runtimeInstance == null) {
// instanciate it with the private constructor
runtimeInstance = new Runtime();
}
// return the instance
return runtimeInstance;
}
}
然后你可以通过
调用该对象Runtime runtime = Runtime.getInstance();
总是为您提供单个实例。