我的android项目中有几个包含许多类的包。当我想在UI活动中创建某个类的对象时,我使用了一种创建私有对象的方法,并在onCreate()
方法之前将其初始化,其中UI活动位于单独的包中。
private SomeClass someClass = new SomeClass();
onCreate(Bundle savedInstanceState) {
// Activity
}
我注意到我的高级程序员使用另一种方法,他们在onCreate()
之前声明对象,并在需要对象时初始化它。
有什么区别并建议我最好的方法?如果我在这里做错了,我想让自己纠正。
答案 0 :(得分:1)
出于某种原因,我喜欢坚持使用类级变量的第一种方法。如果类的对象尚未初始化,这使我无法处理nullpointerexception。留在第一个。例如,让我们取String类:
String mystring;
//in some functions deep inside code
mystring = "hello world";//works great with string
但是让我们采取类似的字符串缓冲区示例:
StringBuffer mystring;
//in some functions deep inside code
mystring.append("hello world");
在第二个例子中,我忘记了mystring = new StringBuffer();因此.append将给出nullpointer异常,编辑器通常是无能为力的。这种情况比你期望的要多得多。与arrayList和其他人一样。
答案 1 :(得分:1)
乍一看,我说如果你在onCreate中声明变量/对象,你只能在该方法中使用它。 (局部范围变量)
在外部创建变量并在第一个执行的方法(onCreate)中初始化变量/对象,你将拥有一个可以在类中的任何地方使用的全类变量,只需要小心保护对它的访问。 if(var != null)
以避免NullPointeException。 (Gloabal范围变量)
我个人不喜欢两种中的任何一种,我只是在每种情况下正确使用它,因为第二种情况会长时间保留内存,如果你只在本地范围内使用该var,则这是不必要的
例如,如果你需要一个在活动开始时播放并在离开时停止的MediaPlayer,你最好全局声明它,以便在onCreate中初始化它,让它在onResume中播放,make它在onStop中停止并在onDestroy中释放,所以:
您只需初始化MediaPleyr一次(onCreate)
每次重新输入活动(onResume)时,MediaPlayer都会启动,无需初始化
离开活动时,MediaPlayer停止(onPause)
当不再需要Activity时,内存被释放,所以没有" IllegalState"异常或对象泄漏(onDestroy)
*你也可以用一堆监听器(onPreparedListener,onCompletionListener,...)完成所有这些,但这只是另一种方式,并且行为略有不同
答案 2 :(得分:0)
我通常更喜欢第二种方法,因为只有在需要时才会创建对象。在第一种方法中,您将创建一个单例对象。该对象甚至在需要之前就会占用内存。 我更喜欢第二种方法的一些情况是:
String LOG_TAG = MyActivity.class.getSimpleName();
如果该对象将在该类的某些部分中使用,则应考虑在该类中声明它。