Java 静态变量、模式和Android性能

Java 静态变量、模式和Android性能,java,android,performance,static,singleton,Java,Android,Performance,Static,Singleton,我正在做一些大型重构操作,这些重构操作与android应用程序中的一些性能改进有关,android应用程序使用了一个包含大量静态变量甚至静态活动引用的类,这些静态变量甚至静态活动引用随后通过应用程序使用!所以我想在Android中寻找一些最佳实践来存储数据,并在我的应用程序中对这些数据进行全局访问 首先,我删除了所有的活动引用以避免任何内存泄漏,但我仍然想知道关于需要在android应用程序中的任何地方使用的静态变量的最佳实践是什么 我读了很多次(,):使用静态变量并不是一个好的实践,最好使用一

我正在做一些大型重构操作,这些重构操作与android应用程序中的一些性能改进有关,android应用程序使用了一个包含大量静态变量甚至静态活动引用的类,这些静态变量甚至静态活动引用随后通过应用程序使用!所以我想在Android中寻找一些最佳实践来存储数据,并在我的应用程序中对这些数据进行全局访问

首先,我删除了所有的活动引用以避免任何内存泄漏,但我仍然想知道关于需要在android应用程序中的任何地方使用的静态变量的最佳实践是什么

我读了很多次(,):使用静态变量并不是一个好的实践,最好使用一个带有getter和setter的单例类来访问我的全局变量,无论我在什么活动中。所以我开始思考一个类,它可能看起来像这样:

public class AppSingleton extends Application {

    private static AppSingleton appInstance;

    // different stored data, which could be relative to some settings ..
    private String setting1;
    private String setting2;

    private AppSingleton() {
        super();
        appInstance = new AppSingleton();
    }

    public static  AppSingleton getAppInstance() {
        if (appInstance == null) {
            appInstance = new AppSingleton();
        }
        return appInstance;
    }

    // Getter and Setter for global access
    public String getSetting1() {return setting1;}
    public void setSetting1(String setting1) {this.setting1 = setting1;}

    public String getSetting2() {return setting2;}
    public void setSetting2(String setting2) {this.setting2 = setting2;}
}
然后我可以使用:

对我来说,AppSingleton听起来不错,因为这个singleton将这个类的实例化限制为一个对象,而且这个类在应用程序中有任何未破坏的活动之前不会被破坏,所以这意味着我可以在我的应用程序的当前生命周期中保留全局数据,例如通过“登录”。但我也可以从getter/setter维护全局变量的状态

但是我也看了android的官方文档,上面说使用静态变量很好,速度更快,而且不要忘记避免使用内部getter和setter,它太膨胀了

我对所有这些都有点困惑,我真的很想了解更多关于这个话题的知识。使用一个类访问代码不同部分所需的某些变量的最佳实践是什么?AppSingleton上面的类在体系结构和性能方面是否值得使用?
在android中使用单例模式管理全局变量是一个好主意吗?

这些行在您的代码中完全错误:

   private AppSingleton() {
        super();
        appInstance = new AppSingleton();
    }

    public static  AppSingleton getAppInstance() {
        if (appInstance == null) {
            appInstance = new AppSingleton();
        }
        return appInstance;
    }
您不能实例化新的
应用程序,Android框架会实例化它。更改为:

   private AppSingleton() {
        super();
        appInstance = this; // keep ref to this application instance
    }

    public static  AppSingleton getAppInstance() {
        return appInstance;
    }
关于访问全局变量。我相信在你的申请表上有这些单身人士会更有条理。应用程序类有不同的职责,您不应该用不同的任务使其过载。这是面向对象的干净编码

此外,有时候Android应用程序中没有太多理由在所有方面都使用getter/setter,因为你不需要像大型项目那样需要太多的访问控制。但这应该根据具体情况考虑其必要性,而不是作为一般规则

例如,你可以这样做:

public class Globals {
    private static final Globals instance = new Globals();
    public static Globals get() { return instance; }

    public String value1 = "Hello"
    public int value2 = 42;
}
然后根据需要调用代码:

Log.d(TAG, Globals.get().value1);
Globals.get().value1 = "World";
Log.d(TAG, Globals.get().value1);
Log.d(TAG, "Value2 = " + Globals.get().value2);

如果这有帮助的话:@Nitesh谢谢你,我已经把这个链接到我的问题上了,这其实很有帮助,但是当我阅读android性能提示时,我也有点困惑……我的坏消息是,我再次发布了相同的链接:)……即使我很高兴知道这个问题的答案。。
Log.d(TAG, Globals.get().value1);
Globals.get().value1 = "World";
Log.d(TAG, Globals.get().value1);
Log.d(TAG, "Value2 = " + Globals.get().value2);