发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 3 下一页 Go 3

请教 newInstance 的用法

    
2004-05-09 20:12
赞助商链接

我是一个java爱好者,向各位请教一个问题:
比如:
在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别
谢谢大家。

1
2004-06-10 16:03

newInstance :一般不会有public的Constructor
new :该类必须有public 的Constructor

2004-06-11 01:01

newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。

结论:newInstance只有必须要用(就是new不能用的时候)才用。

2004-06-15 17:31

> newInstance: 弱类型。低效率。只能调用无参构造。
> new: 强类型。相对高效。能调用任何public构造。
>
> 结论:newInstance只有必须要用(就是new不能用的时候)才
> 谩?>

newInstance 比 new 低藕合,各有各的用法而已。

2004-06-16 03:30

谈不上什么低耦合。newInstance 不过就是能做动态生成而已。这是reflection的功能,也是唯一的功能。

假如new也可以动态,就没什么区别了,如:new "MyClass"。

我发现不知道为什么,很多人认为reflection可以减少耦合。可能都是指的可以在配置文件里面配置类名字吧。

这在客观上确实达到了降低耦合的目的,但是,实际上,我要说,此处降低耦合的不是reflection,而是那个你cast过去的interface。interface,只有interface,才是推动历史的唯一力量。:->

reflection不过提供了把实现的决定时间延迟到运行时的功能而已。


而其实,即使使用reflection,也应该把它包装在一个抽象工厂中,如此才能隐藏reflection的缺点。而且,抽象工厂可以表达reflection,而reflection不能表达抽象工厂。

举个例子:

不要直接在客户代码中这样写:
MyInterface obj = (MyInterface)Class.forName(theclassname).newInstance();
如此,你就把自己强制绑在reflection上,这也是强耦合的一种。

而是利用抽象工厂:
interface MyInterfaceFactory{
MyInterface newInstance();
}
class ClientCode{
private final MyInterfaceFactory myfactory;
public void f(){
MyInterface obj = myfactory.newInstance();
}
}

这个myfactory是一个抽象工厂对象,它可以通过构造函数注射进来。

然后,可以提供一个使用reflection的工厂实现

class ReflectionFactory implements MyInterfaceFactory{
public MyInterface newInstance(){
return Class.forName(name).newInstance();
}
private final String name;
}
这样,reflection也好,newInstance也好,都是一个工厂实现而已,不会影响整个框架。
这才是低耦合。

3Go 1 2 3 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com