我正在看一些Android开发教程,我看到了下面的案例
MediaPlayer mp = MediaPlayer.create(this, R.id.song)
我的问题如下:为什么在创建新的 MediaPlayer 对象时不涉及“新”关键字?我认为每当您创建类的实例时都必须使用 new
那么如果我这样做呢
MediaPlayer mp = new MediaPlayer();
mp.create(this, R.id.song);
这是错的吗?
我的问题如下:为什么在创建新的 MediaPlayer 对象时不涉及“新”关键字?
好吧,您正在调用一个静态方法,该方法将(可能)创建一个新实例。
也许该方法直接调用构造函数 - 或者它创建了某个子类的实例。或者,它可能会返回对现有实例的引用。
这就是工厂方法的好处——它们可以隐藏它们的实现细节:)
您实际上可以在 MediaPlayer 上调用new 。
以下摘自http://developer.android.com/reference/android/media/MediaPlayer.html
当 MediaPlayer 对象刚刚使用 new 创建或在调用 reset() 之后,它处于空闲状态 [...] 此外,使用 new 创建的 MediaPlayer 对象处于空闲状态,而那些使用重载之一创建的对象方便的创建方法不处于空闲状态。实际上,如果使用 create 方法创建成功,则对象处于 Prepared 状态。
基本上使用新方法与静态方法只会改变您的 MediaPlayer 所处的状态。如果您使用新方法,则必须使用 setDataSource() 对其进行初始化并使用 onPrepare() 进行准备。准备好使用静态助手了。
这是一个“工厂”功能。它在内部调用new MediaPlayer()
,您只是在课堂外看不到它。