2016-05-30 309 views
2

在java中,我了解到,我使用new关键字通过开发者页面上下文对象,而不使用new关键字一样被实例化要实例化一个对象如实例化对象

Employee e = new Employee(); 

在Android中,这个:

Context myContext = getApplicationContext(); 

这是为什么?我早该想到,一个上下文对象应创建使用new关键字像这样以同样的方式:

Context myContext = new Context(); 

我觉得有人可能会顶嘴说,getApplicationContext()方法返回类型的上下文,因此的对象上面的语法,但是否有人有一个更深更解释,为什么做这个而不是简单地 这样

Context myContext = new Context(); 

回答

2

因为有时候你根本不想/需要每次都创建一个新的实例,有时候你只想获得对象而不需要自己实际处理它的创建。

例如,有一个Singleton design pattern,在其常见实现中,由于构造函数是私有的,因此无法使用new关键字创建新实例。那么,什么是剩下的工作就是通过调用一个静态方法得到一个类的实例:

public class MySingleton { 
    private MySingleton() { } 

    public static MySingleton getInstance() { ... } 
} 

有时你可能需要使用一个Factory method pattern,来处理新对象的创建/实例化,以及:你调用一个方法并返回一个新的或现有的对象,而不显式调用构造函数。

在Context的情况下,您不需要创建此对象,因为系统会为您处理它,并且该过程是透明的。你只需要调用一个方法,并且你有你的实例。

+0

这是非常有用的信息谢谢,我从来不知道Factory方法模式直到现在,getApplicationContext()是一个工厂方法的例子吗? –

+1

工厂方法创建它们返回的对象,并且在调用getApplicationContext()时应用程序的上下文已经存在,因此不,这不完全是工厂方法。在这种情况下,我们更接近Singleton,因为返回的对象是应用程序进程的单个全局对象。 –

2

从文档:

返回 当前进程的单个全局应用程序对象的上下文。

因此,当您启动应用程序时,系统会为其分配一个进程。做Context c = new Context()不会让你成为那个过程的实例。

2

正如docs说:

接口有关的应用程序环境的全局信息。这是一个抽象类,其实现由Android系统提供。它允许访问特定应用的资源和类,以及向上调用应用程序级的操作,如通过使用getApplicationContext()发射活动,广播和接收意图等

所以,您呼叫的情况下包含您的应用程序特定资源的对象。

创建一个新的Context类型对象没有意义,因为它不包含有关您的应用程序环境的信息。

+0

应用程序环境需要什么? –

+1

我想这篇文章会更好地为你解释它http://www.simplecodestuffs.com/what-is-context-in-android/ –

+1

我曾阅读上下文对象的最佳文章,谢谢 –