如何将类实例化限制为一个?

时间:2017-10-08 11:00:53

标签: java class object

//问题:将类的实例限制为一个。

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

我想了解这段代码实际的作用,以及它如何限制对象的创建。 什么是其他可能的解决方案?优选地,该代码解决了该问题。

4 个答案:

答案 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。

  1. Eager意味着您的Singleton将在您的应用程序启动时进行实例化。这就是你做的。大“亲”是它的前沿和简单。如果你的Singleton占用空间很大并且需要很长时间来初始化那么你的应用程序会在必要之前“浪费”内存,并且需要更长的时间进行初始化,这将是一个“骗局”。
  2. Lazy意味着只有在第一次实际请求时才会创建Singleton。 “优点”:您的Singleton不会延迟您的应用启动时间并节省内存。 “骗局”:实施复杂而且奇特。搜索网络以了解原因。但是如果你使用一些框架(例如Spring)负责管理你的所有实例,你需要做的就是说一个特定的类必须是一个单例和懒惰,没有复杂性。
    基本上,建议是,如果你能够负担得起你的单身人士急切地(即可以容忍该方法的缺点),那么使用这种方式。如果由于某种原因这种方法不可接受,那么使用Lazy instanciation

答案 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();

总是为您提供单个实例。