java new和newinstance的区别

区别在哪里?为什么有这样的区别?

 

一、区别在哪里?

1.根本就不是一个东西

不同。new 是java中的关键字,是创建一个新对象的关键字。


newInstance不是关键字,newInstance()是java反射框架中类对象(Class)创建新对象的方法。

2.功能上

相同,都可以创建一个类的实例对象。

3.创建对象时的区别

不同。new一个对象需要2步:加载类、并且实例化。newInstance()则需要先声明一个类,然后获取这个类的无参构造方法,之后调用构造方法来创建对象。

Class.java

因为这里需要取无参的构造方法:

所以改写一下刚才的ReturnPojo类,重写无参的构造方法:

ReturnPojo.java

于是在运行时,new和newInstance()都会调用这个无参的构造方法。输出两次“我被调用了!有点开心!”。

二、为什么有这样的区别?

经过上面的对比,发现new和newInstance()实现的效果差不多,那么为什么需要两个不同的创建方法?区别就在于过程。

1.new

new后面接类名是最常见的实例化方式。使用new的前提是必须知道一个明确的类:

在这里,实现类ReturnPojo的类名是必须要知道的。

相比之下,newInstance()方法不需要知道明确的实现类,只需要给一个class,就可以实例化:

我们举个例子看看区别。

假如现在有一个接口Db,有一个实现类名为Oracle,那么实现这个接口的代码为:

如果有一天我们想换用Mysql了,我们就要把Oracle实现类改成Mysql实现类:

看上去只是改个实现类而已,没什么大问题。问题是,如果这样的语句特别多/特别分散,我们就不得不在整个项目中到处寻找需要改动的地方,非常麻烦。

为了解决这个问题,一般会使用工厂模式,所有Db的实例都由DbFactory提供。

抽象工厂接口类:

抽象工厂实现类:

如果需要更换db实现类,只需要改工厂类的代码即可,方便集中修改,统一管理。

2.newInstance

继上个例子。如果我们使用new,必须改动工厂类中的代码,然后重新编译,才能完成db的更换。现在我们的要求更高了,能不能不需要重新编译,就能完成Db的更改?

使用new是肯定做不到的,无论如何你都要亲自去改类名,改完后需要重新编译。

相比之下,如果使用newInstance(),不需要改动任何代码,就可以做到。

我们把Db的具体实现类的类名放到配置文件中,然后通过newInstance()生成实例:

这样,只需要更改配置文件中的类名,就可以实现相应的替换,省事不少。

三、总结

通过实际的例子,就能更好地理解new和newinstance的区别。

发表评论

电子邮件地址不会被公开。 必填项已用*标注