2012-08-03 94 views
0

类MediaPlayer的实例我在看一些教程Android开发,我看到了下面为什么不使用new关键字

MediaPlayer mp = MediaPlayer.create(this, R.id.song) 

的情况下我的问题是:为什么没有一个“新“在创建新的MediaPlayer对象时涉及到关键字?我认为,新的,必须随时使用您创建

的实例那么,如果我做

MediaPlayer mp = new MediaPlayer(); 
mp.create(this, R.id.song); 

这是错的?

+0

你没有错。我在解决方案中解释了原因。 – 2012-08-03 14:28:03

+0

这类事情在处理SPI类型的类时比较常见,比如Runtime,Toolkit,DocumentBuilderFactory等等。使用静态工厂方法允许用户不将自己绑定到特定的实现。或者在Toolkit的情况下,您可以使用标准工具包来运行平台,或者可能是无头工具包。在这种特殊情况下,它似乎只是API作者的一种风格选择。 – Matt 2012-08-03 15:57:48

回答

0

这是一个“工厂”功能。它在内部叫new MediaPlayer(),你只是不会从课外看​​到它。

3

我的问题是:为什么创建一个新的MediaPlayer对象时没有涉及“新”关键字?

那么你正在调用一个静态方法,它会(大概)创建一个新的实例。

也许该方法直接调用构造函数 - 或者它可能会创建一些子类的实例。或者,也许它会返回一个对现有实例的引用。

这是对工厂方法的好处 - 他们得到隐藏实现细节:)

+0

确实如此,文档称它为“便利方法”http://developer.android.com/reference/android/media/MediaPlayer.html – smcg 2012-08-03 14:12:46

+0

那么,如果我做MediaPlayer mp = new MediaPlayer(); mp.create(this,R.id.song);这是错的吗? – dido 2012-08-03 14:13:21

+1

@dido你的第二个电话不会做任何事情,因为你不保存结果。如果你保存结果'mp = mp.create(this,R.id.song)',你将覆盖并放弃调用构造函数的结果,所以虽然在技术上不是错误的,但它毫无意义。(加上IDE和/或编译器会警告你'create'是一个静态方法,应该在静态上下文中调用,即从类中而不是从对象中调用。) – 2012-08-03 14:22:24

0

你实际上是允许对一个叫的MediaPlayer新

http://developer.android.com/reference/android/media/MediaPlayer.html

采取当使用新的或复位后()被调用时,它是处于空闲状态时就创建了一个MediaPlayer对象[...]此外以下,在MediaPlayer对象创建使用new将处于Idle状态,而使用new方法创建的方法不会处于Idle状态。事实上,如果使用create方法创建成功,则对象处于“准备好”状态。

基本上都采用新的VS静态方法只是改变什么说明你的MediaPlayer的是,如果新的,那么你就必须用的setDataSource进行初始化(),并与onPrepare准备它()。当你准备好与静态助手一起去的时候。

相关问题