昨日看《Effective Java》第二条:遇到多个构造器参数时要考虑用构造器。其中,演示通过Builder模式,构建复杂的对象。因为之前对java不是很了解的原因。很疑惑:static class居然可以构建实例?之前,在.net中的静态类一直都是不能实例化的。
查了下资料,果然在java中只有内部静态类才能被实例化,通常称之为嵌套类。而*类,也就是没有被嵌套在另一个类的内部的类,不能被标记为static。这个和.net中有所不同,其实,我个人觉得两种语言都有各自的关注点。
从功能上来说,java的外部类不能被标记为static,在开发中并没有丝毫的不便。一般来讲无论是成员还是变量,被标记为static则为类所有,与类的实例无关。所以我觉得很少有需求,需要构建一个静态类。在.net中静态类,意味着其包含的所有成员都是静态的。所以出于这样的限制,.net中静态类通常用来作为工具类。但是,在java中,一个非静态类,里面包含的方法都为static,不能实现同样的功能吗?我觉得,在java中,并没有什么缺失所在。
但是,是不是.net这么做就白费功夫了吗?其实,.net也有它的考虑,但是不是功能上的。.net中一个类被标识为static,意味着这个类中所有的成员都必须为static的,这个在编译时会做静态检查,通过编译时的强制性,来约束程序员遵守规则。并且如果一个类被标识为static,那么在程序集被加载的时候该静态类就会被加载,直到程序集被卸载。并且据说CLR对其作了优化,我想可能JVM也是吧,暂时不太了解。
不过,java中的内部静态类可以构建实例,在我看来,理解起来挺别扭的。不过,如果把java中的内部类都当做其成员来理解,就容易多了。可以把内部静态类看成是外部类的一个static 类型,不属于外部类的实例。具体,关于内部静态类和外部类的关系等讲解,网上也不少,在此就只是比较一下两种语言的不同点而已。
原文发布时间为:2011-07-06
本文作者:vinoYang
本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。