应用程序类中的内部类,是不是?

时间:2012-11-26 11:37:20

标签: java static inner-classes android

我正在一个有很多活动的应用程序中工作,大多数活动共享多个对象,所以我通过扩展android Application类来存储选定的对象来创建MyApplication类。但是在访问提供者/助手类中的那些对象时我觉得不舒服b'coz上下文在获取应用程序实例的提供者中是需要的。

所以我计划在MyApplication类中创建名为SelectionProvider的静态类来存储选定的对象,然后我可以以静态的方式访问那些没有创建实例的MyApplication。

具有静态内部类的MyApplication类如下

class MyApplication extends Application {
    public static final String TAG = "MyApplication";



    public static class SelectionProvider {
        private static UserObj userObj;
        private static TownObj townObj;
        private static StoreObj storeObj;

        public static UserObj getUserObj() {
            return userObj;
        }

        public static setUserObj(UserObj userObj) {
            this.userObj = userObj;
        }

        public static TownObj getTownObj() {
            return townObj;
        }

        public static setTownObj(TownObj townObj) {
            this.townObj = townObj;
        }

        public static StoreObj getStoreObj() {
            return storeObj;
        }

        public static setStoreObj() {
            this.storeObj = storeObj;
        }
    }
}

这是正确的做法吗?如果不是为什么?

将所选对象(存储在内部类中)保留在整个应用程序生命周期中,还是会在任何地方销毁?

3 个答案:

答案 0 :(得分:1)

此方法或其他地方的静态值应该可以正常运行并持续应用程序的生命周期,只要您没有multiple processes运行需要访问此对象的权限。如果是这种情况,您应该使用Service来处理交易。

答案 1 :(得分:0)

我不会将其设计为内部类。我将创建SelectionProvider(以及您需要的任何其他类)作为它自己的独立类,并在MyApplication类的onCreate方法中实例化它。

您不应该实例化应用程序对象,因为可以随时通过调用getApplication()并将其强制转换为应用程序类(例如(MyApplication)getApplication();然后您可以访问该类创建的任何对象)。

如果数据持久性是这些类的问题,请考虑将它们的值存储在SQLLite中或作为共享首选项存储,因为Android可能会在应用程序需要资源时随时终止应用程序。

答案 2 :(得分:0)

我会创建一个自己的单例类:

public class Data {

    /* Start of singleton block */

    private static Data data = new Data();

    private Data(){
    }

    public static Data getInstance(){
    }

    /* End of singleton block */ 

    private SelectionProvider selectionProvider;

    public SelectionProvider getSelectionProvider(){
       return selectionProvider;
    }

    /* other necessary methods (get, set) and classes below */

}

这样您就可以使用Data.getInstance().getSelectionProvider()访问对象了。 这将在活动应用程序中可用,但您可能希望构建一些持久存储数据,以便用户离开应用程序一段时间后再回来:

public SelectionProvider getSelectionProvider(){
    if(selectionProvider == null)
        selectionProvider = readSelectionProviderFromPersistantStorage();

    return selectionProvider;
}