在android中实例化和初始化对象的正确方法

时间:2014-06-18 11:05:44

标签: android object oncreate

我的android项目中有几个包含许多类的包。当我想在UI活动中创建某个类的对象时,我使用了一种创建私有对象的方法,并在onCreate()方法之前将其初始化,其中UI活动位于单独的包中。

private SomeClass someClass = new SomeClass();

onCreate(Bundle savedInstanceState) {
   // Activity
}

我注意到我的高级程序员使用另一种方法,他们在onCreate()之前声明对象,并在需要对象时初始化它。 有什么区别并建议我最好的方法?如果我在这里做错了,我想让自己纠正。

3 个答案:

答案 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)

我通常更喜欢第二种方法,因为只有在需要时才会创建对象。在第一种方法中,您将创建一个单例对象。该对象甚至在需要之前就会占用内存。 我更喜欢第二种方法的一些情况是:

  • 如果将从活动的不同部分使用相同的对象。因此,您不希望每次在使用之前检查null是否需要干净的代码并且您想要更清晰的代码。
  • 如果该类的单个公共对象不会改变。通常你会把它变成静态的。很好的例子是:
    String LOG_TAG = MyActivity.class.getSimpleName();
  • 如果您的活动中经常使用该对象。例如,对于经常与服务器进行通信的活动,您应该创建以这种方式进行通信的类的对象。另外一个例子是

如果该对象将在该类的某些部分中使用,则应考虑在该类中声明它。