Java 使用扩展类的多个活动的SharedReference

Java 使用扩展类的多个活动的SharedReference,java,android,memory-management,memory-leaks,Java,Android,Memory Management,Memory Leaks,我有一份有三项活动的申请。这是我的活动生命周期:活动1->活动2->活动3。我的所有活动都使用“完全”相同的首选项。 因此,我创建了一个扩展类,用于我的所有活动。 范例 下面是我每项活动的一个例子 public class Activity1 extends myPreferences{ } public class Activity2 extends myPreferences{ } public class Activity3 extends myPreferences{ } 所以我

我有一份有三项活动的申请。这是我的活动生命周期:活动1->活动2->活动3。我的所有活动都使用“完全”相同的首选项。 因此,我创建了一个扩展类,用于我的所有活动。 范例

下面是我每项活动的一个例子

public class Activity1 extends myPreferences{ 
}
public class Activity2 extends myPreferences{ 
}
public class Activity3 extends myPreferences{ 
}
所以我的问题是,在我的类中使用静态变量,并且在我的应用程序中只运行一次SharedReferences是否更好。例如,我将检查玩家名称是否为空

public class myPreferences extends Activity{

protected static string PlayerName;
protected static float maxPlayerHealth;
protected static float minPlayerHealth;
// there are about 15 variables

@Override protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

  if(PlayerName ==null)
  {
      SharedPreferences prefs = this.getSharedPreferences("general_settings", Context.MODE_PRIVATE); 

      PlayerName = prefs.getString("PlayerName", null);

      maxPlayerHealth = prefs.getFloat("PlayerName", 0.0f);

      minPlayerHealth = prefs.getFloat("PlayerName", 0.0f);

      //etc for rest of my preferences
   }
}
两种方法中哪一种更好? 1) 内存使用情况如何?静态变量将使用更多内存?内存泄漏有风险吗? 2) 两种方法中哪一种性能更好?我想如果我不总是阅读我的偏好,它会稍微好一点。 3) 我应该使用私人签名而不是受保护的签名,还是不重要?
4) 如果我的所有活动在堆栈中同时打开,变量将被重新创建3次?每个扩展myPreferences类的活动各一个?

有很多内容需要涵盖,但我会尽最大努力:

内存使用情况如何

在Java中,当我们只声明一个类类型的变量时,只创建一个引用(不为对象分配内存)。要将内存分配给对象,必须使用new()。在创建静态变量堆栈时,将使用Java中的内存。它包含特定于方法的基元值和对堆中对象的引用(从方法引用)。以后进先出(LIFO)顺序访问此内存。它的基本意思是,只要你创建了一个静态变量,就会给它分配一段内存,这个内存一直存在,直到你的应用程序关闭

静态变量将使用更多内存?内存泄漏有风险吗

更多的记忆?不但在应用程序关闭之前,它基本上会分配一块内存<代码>内存泄漏有风险吗?-是的,可能是因为它可能会创建一个循环依赖项,该依赖项可能不会让您的对象类型被破坏,我可能是错的,但在您的情况下不会发生这种情况

这两种方法中哪一种性能更好?我想如果我不经常阅读我的偏好,它会稍微好一点

据我所知,静态可能具有更好的性能,因为您将在变量中携带它,而不必每次都从包中获取它

我应该使用私人签名而不是受保护的签名,还是不重要

派生类不继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。因此,您可以根据您的用例来决定

如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?扩展类myPreferences的每个活动一个


如果项目是静态的,它将只创建一次,静态变量就像一次性的东西<代码>每个扩展myPreferences类的活动一个-不,它不会

有很多内容需要涵盖,但我会尽我所能:

内存使用情况如何

在Java中,当我们只声明一个类类型的变量时,只创建一个引用(不为对象分配内存)。要将内存分配给对象,必须使用new()。在创建静态变量堆栈时,将使用Java中的内存。它包含特定于方法的基元值和对堆中对象的引用(从方法引用)。以后进先出(LIFO)顺序访问此内存。它的基本意思是,只要你创建了一个静态变量,就会给它分配一段内存,这个内存一直存在,直到你的应用程序关闭

静态变量将使用更多内存?内存泄漏有风险吗

更多的记忆?不但在应用程序关闭之前,它基本上会分配一块内存<代码>内存泄漏有风险吗?-是的,可能是因为它可能会创建一个循环依赖项,该依赖项可能不会让您的对象类型被破坏,我可能是错的,但在您的情况下不会发生这种情况

这两种方法中哪一种性能更好?我想如果我不经常阅读我的偏好,它会稍微好一点

据我所知,静态可能具有更好的性能,因为您将在变量中携带它,而不必每次都从包中获取它

我应该使用私人签名而不是受保护的签名,还是不重要

派生类不继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。因此,您可以根据您的用例来决定

如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?扩展类myPreferences的每个活动一个


如果项目是静态的,它将只创建一次,静态变量就像一次性的东西<代码>一个用于扩展类myPreferences的每个活动-不,它不会

而是将此逻辑绑定到一个
活动
,我会创建一个单独的类来封装您想要的行为。例如:

class PlayerSettings {

    private static final String KEY_NAME = "com.my.packagename.PLAYER_SETTINGS_NAME";
   //Again for other keys...

    private final SharedPreferences prefs;

    PlayerSettings(SharedPreferences prefs) {
        this.prefs = prefs;
    }

    String name() {
        return prefs.getString(KEY_NAME, "");
    }

    float maxHealth() {
        return prefs.getFloat(KEY_MAX_HEALTH, 0.0f);
    }

    float minHealth() {
        return prefs.getFloat(KEY_MIN_HEALTH, 0.0f);
    }

}
用法:

final SharedPreferences prefs = PrefenceManager.getDefaultSharedPreferences(this);
final PlayerSettings player = new PlayerSettings(prefs);

player.maxHealth();
player.name();

我宁愿创建一个单独的类来封装所需的行为,而不是将此逻辑捆绑到
活动中。例如:

class PlayerSettings {

    private static final String KEY_NAME = "com.my.packagename.PLAYER_SETTINGS_NAME";
   //Again for other keys...

    private final SharedPreferences prefs;

    PlayerSettings(SharedPreferences prefs) {
        this.prefs = prefs;
    }

    String name() {
        return prefs.getString(KEY_NAME, "");
    }

    float maxHealth() {
        return prefs.getFloat(KEY_MAX_HEALTH, 0.0f);
    }

    float minHealth() {
        return prefs.getFloat(KEY_MIN_HEALTH, 0.0f);
    }

}
用法:

final SharedPreferences prefs = PrefenceManager.getDefaultSharedPreferences(this);
final PlayerSettings player = new PlayerSettings(prefs);

player.maxHealth();
player.name();

这没关系——不管它值多少钱,我不会把它放在一个基本的
活动中,而是创建我自己的
PlayerSettings
类,它保留了所有这些内部内容,并且只公开了
name()
maxHealth()
minHealth()
的访问器,但这取决于您。如果您采用这种方法,那么我建议不要将值设置为静态值,因为它们是全局可修改的。我对其他解决方案持开放态度。你能举个例子吗?任何例子