应用子类和单例。创建新实例时?

时间:2012-11-21 19:12:34

标签: java android singleton instance

我将单例方法用于Application的子类。我使用以下内容:

public class MyApplication extends Application {

    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

    public static MyApplication getInstance() {
        if (instance == null) {
            synchronized (MyApplication.class) {
                if (instance == null)
                    new MyApplication();
            }
        }
        return instance;
    }

    ...
    ...

我的问题是:如果实例被分配一次,在系统初始调用类创建者的过程中,实例应该永远不会为null!因此if (instance == null)内的getInstance()永远不会返回true。还是我错了?

修改

我更正了维基百科上的代码:

public class volatile MyApplication extends Application {

    private static MyApplication instance;

    public MyApplication() {

    }

    public static MyApplication getInstance() {
        if (instance == null) {
            synchronized (MyApplication.class) {
                if (instance == null)
                    instance = new MyApplication();
            }
        }
        return instance;
    }

    ...
    ...

已添加volatileinstance = new MyApplication();这是正确的吗?我的问题仍然存在......

3 个答案:

答案 0 :(得分:0)

你错过了一个非常重要的事情,让它正常工作。

instance = new MyApplication();

如果没有这一行,那么instance将始终为null,并且您将返回null。否则,当您调用新的MyApplication();

时,将创建实例

答案 1 :(得分:0)

如果您退出应用程序或Android将其取消,它将只为null,在这种情况下,您无法检查它;)

您永远不应该创建应用程序类的实例,因此不应该new MyApplication()。您可以将Application扩展到其他类中,然后实例化那些但是您正陷入风险区域,您应该质疑您的方法。

请参阅应用程序生命周期文档:

http://developer.android.com/reference/android/app/Application.html

总之,instance=this适用于其他类使用((MyApplication)this.getApplication()).instance;

那就是说,你应该去Herr K的个人资料并为他提供一个答案,因为他的评论是正确的解决方案,而不仅仅是我的问题的答案。

关键是,你不需要任何实例的东西。 (MyApplication)this.getApplication()将始终为您提供参考。

答案 2 :(得分:0)

我将此代码用于我的Singleton类。试试这个。

公共类MenuPage扩展了Activity {

    private static MenuPage m_instance = null;

    /**
     * Get the singleton instance of this class
     *
     * @return MenuPage
     */
    public static MenuPage getInstance() {
        if (m_instance == null) {
            m_instance = new MenuPage();
        }
        return m_instance;
    }

    /**
     * Constructor, default
     */
    public MenuPage() {
        m_instance = this;

    }
    /**
     * Called when the activity is first created.
     */
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.main);

    }
}