为什么声明一个类的自静态实例

时间:2014-06-26 16:00:44

标签: java android

我有时会看到人们创建自我实例,例如:

public class Example extends Service
{
    private static Example mInstance = null;


     public void onStart( Intent aIntent, int aStartId )
    {

        mInstance = this;
        .
        .
        .
   }
}

这是为了什么目的?

7 个答案:

答案 0 :(得分:1)

这称为Singleton设计模式。当有一个对象的单个实例对非静态数据执行操作时,将使用单例。

请参阅here

答案 1 :(得分:1)

Android Service(子)类不能是单例,因为框架需要访问类的默认构造函数。我可以想到保持对调用onStart的(最后一个)实例的静态引用的唯一原因是简化可能碰巧驻留在静态方法中的一些内部代码。

考虑到很久以前onStart被弃用(从API级别5开始),这很可能是Android早期编码风格不好的一个例子。

答案 2 :(得分:0)

在线程不安全的单例模式实现中,您将拥有一个私有构造函数,并在必要时初始化该实例并返回它。public static getInstance方法。

这是一个例子。请注意,建议使用单元素枚举的商品而不是下面的代码来实现“真正的”单例。

public class MyThreadUnsafeSingleton {
    private static MyThreadUnsafeSingleton instance;
    private MyThreadUnsafeSingleton() {
        //TODO some ctor logic
    }
    public static MyThreadUnsafeSingleton getInstance() {
        if (instance == null) {
            instance = new MyThreadUnsafeSingleton();
        }
        return instance;
    }
}

最后请注意,上面的模式有一个变体,通过使用嵌套的“holder”类在单个类加载器中是线程安全的,但这完全超出了范围。

答案 3 :(得分:0)

这样其他类就可以在对象上获取实例并调用实例方法。它经常与Singleton模式一起使用。而对于Android中的服务和活动来说,这是一个非常糟糕的主意 - 它会在结束后保留​​对Activity / Service的引用,这将导致内存泄漏。

答案 4 :(得分:0)

除了关于Singleton模式的其他答案之外,自我实例可以用作常量。这就是Color类的情况,它定义了每种常见颜色的实例。

http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html

答案 5 :(得分:0)

如果它有私有默认构造函数,则可能是singleton

如果它没有,那就是一些奇怪的东西。

这种布局强制此类的所有对象实例共享数据,而不管它们何时被实例化。调用OnStart的对象实例将成为对此类的任何引用的基础数据源,无论它们何时被声明或实例化(在OnStart之前或之后),并且无论它们是在哪个线程上创建的。

当然,总有可能有班上的成员不要为mInstance.Member而烦恼并使用它。会员。那种混合和匹配可能最终会带来灾难性的后果。

很难想象这个具体用途,但我的猜测是该类是一些有关该过程的全局资源的抽象,例如表单/窗口或Web服务客户端,用于缓存其凭据。可能是任何事情。

如果这段代码是在2003-2005(早期的c#天)附近编写的,我猜它是一个单调的单一的实现 - 当时设计模式正在成为一种东西,它有点流行单身人士是所有教科书中的榜样。事实证明,它是依赖注入和嘲弄的可怕模式,所以这些日子这种模式并没有被广泛使用。

答案 6 :(得分:0)

这种范例通常用于构造繁重或缓慢的对象,只需要一个。

public class Server {
    private static Server server = null;

    // Stop them making their own.
    private Server () {
        // Heavyweight stuff.
    }

    public static Server getServer () {
        if ( server == null ) {
            // Heavy constructor.
            server = new Server();
        }
        return server;
    }
}

在多线程环境中,它通常与singleton design pattern结合使用。