在onCreate()方法中,我加载了一个级别列表.它存储在单例结构中(使用枚举).当我按下后退按钮并再次返回时,列表仍然存在,并再次添加所有级别.我不明白为什么会发生这种情况,因为Activity Lifecycle声明该进程在再次调用onCreate()之前被终止.
为什么会这样?
编辑,一些代码:
在单独的文件中:
public enum GameInformation {
INSTANCE;
public List<Level> levelSet;
public void loadLevelSet(Context context) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在主要活动中:
public void onCreate(Bundle savedInstanceState) {
GameInformation.INSTANCE.loadLevelSet(this);
}
Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们经常使用实用程序类及其静态方法来加载一些图标.这个实用程序类是单例.
但是在运行环境中,我们找到了这个类的314个实例,在哪种情况下会发生这种情况?
在工作中的 Sonar 报告中,我们对 Android 项目提出了一些警告:
多线程正确性 - 静态字段 findbugs 的延迟初始化不正确:LI_LAZY_INIT_STATIC
为了纠正这些问题,我被引导到有关双重检查锁定的维基百科条目
http://en.wikipedia.org/wiki/Double_checked_locking_pattern#Usage_in_Java
当我查看 Android 框架代码时,我没有看到使用双重检查锁定,例如,WebViewDatabase 类只是使其 getInstance(Context) 方法同步:
public static synchronized WebViewDatabase getInstance(Context context) {
if (mInstance == null) {
mInstance = new WebViewDatabase(context);
}
return mInstance;
}
Run Code Online (Sandbox Code Playgroud)
Android 中正确的方法是什么?
提前致谢
现在我想弄清楚java中的Enum到底是什么.我知道它们是如何工作的以及如何/何时使用它们但是我对它们究竟是什么有点不清楚.基于他们的行为,在我看来,他们只不过是一个私有构造函数的类.然而,在我看来,编译器正在对它们做一些特殊的事情,因为Enums有一个特殊的方法values(),它不会出现在Oracle doc站点的Enum类中.
我的问题是,Enums究竟是什么以及编译器如何解释它们?
考虑Singleton:
public final class MySingleton {
private static class Nested
{
private static final MySingleton INSTANCE = new MySingleton();
}
private MySingleton()
{
if (Nested.INSTANCE != null)
{
throw new IllegalStateException("Already instantiated");
}
}
public static MySingleton getInstance()
{
return Nested.INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有放任何锁,但为什么这是Singleton问题的线程安全解决方案?
默认情况下,一个类是单身还是不单身.
public class You{
}
Run Code Online (Sandbox Code Playgroud)
public class My(){
public static void main(String a[]){
You you=new You();
}
}
Run Code Online (Sandbox Code Playgroud)
是you对象是单身..如果它是单身如何使它成为原型..如果它是原型如何使一个类作为单身..
先感谢您..
我想创建一个单例对象,我找到了3种方法,其中一种更好,为什么其他方式不好.假定构造函数是私有的.
方法1:
class ClassX{
private static ClassX objX = null;
static{
objX = new ClassX();
}
//get objX method
}
Run Code Online (Sandbox Code Playgroud)
方法2:
class ClassX{
private static ClassX objX = new ClassX();
//get objX method
}
Run Code Online (Sandbox Code Playgroud)
方法3:
class ClassX{
private static ClassX objX = null;
public ClassX getInstance(){
if(objX == null)
return new ClassX();
else
return objX;
}
}
Run Code Online (Sandbox Code Playgroud)