java的new真的给我们带来了麻烦吗?

很多程序员多在抱怨java的new浪费了太多的内存,应该大量的使用static。但依据我观察banq老师的文章来看,banq老师似乎对这些看的不太重。我不知道是不是因为banq老师了解OO思想的真谛。
而在我看来我觉得Thinking in java 的第一章的对象导论给了我很大的启发。书中提到:汇编语言是对底层机器的轻微抽象,C语言是在汇编语言的基础上再次的对机器低层的抽象,而OOP是对低层的完全抽象;对事物的抽象程度决定了代码了优劣(书中原话不太记得了,据我的理解是这样的)
正因为OOP能够使程序员享受最大的快乐!
而java是OO现在的最佳解决方法,那么我们又何必只挑它的刺呢?
再而有了java程序员才有时间享受java(咖啡).

以上只是一个初学者的一点愚见中的遇见而以,如有出错望请大家指出。
如有理论性错误,望大家不要只顾笑顺便提出!。

>抱怨java的new浪费了太多的内存,应该大量的使用static
前半句在某些情况下正确,后半句绝对错误。

说这话的是完全不懂对象,完全没有OO基础知识,但是这些人还在从事Java/.NET等OO软件开发,相当于外行人冒充内行,可见当前中国软件业水平多么低下。

为什么说这些程序员完全不懂OO呢?
因为他们只知道对象两个表面含义,却不懂对象背后的含义,对象重要特征是什么?对象重要的特征就是有生命的,有scope的,有生命周期的,这其实是一个很朴素的哲学思想,没有永垂不朽的东西,任何物体都是有生命的。

既然,对象有生命,那就当然有生有死,在java中,对象什么时候死已经无需我们操心,因为有垃圾回收机制,我们程序员只要决定对象什么时候生就可以,也就是对象什么时候创建,以何种方式创建。

对象可以new方式创建,也可以使用创建模式创建,方式很多,Ioc模式的诞生,特别是自动配对auto wiring的Ioc诞生,让对象的创建也无需我们来编码了,这更大大解决程序员的软件开发生产力,这也就是Jdon On Rails为什么快速的原因之一。

回到对象的生命周期上来,使用静态实际就是变态的延长对象的生命周期,虽然也解放了程序员,无需程序员照顾对象创建,但是这是一种错误的解放,是一种虽然简单,但是方向完全错误,可能导致更大性能陷阱的解决方式,这个我已经在单例是邪恶等帖子中反复表述,因为我们现在的软件是一个多线程环境,如果你使用静态,不但导致非OO系统,到处是长命百岁的对象,系统难于维护;更重要不小心就导致多线程变成单线程系统,也就是单用户系统,某个时刻只能一个用户操作这个系统。换句话说:就是系统缓慢,人操作一多就死机。

[该贴被banq于2008-04-09 09:56修改过]

对象重要的特征就是有生命的,有scope的,有生命周期的,这其实是一个很朴素的哲学思想,没有永垂不朽的东西,任何物体都是有生命的。


顶这句话!

果然一针见血!讲得太好了,这是在书本上学不到了东西呐.
该珍惜jdon!

非常同意banq的观点,这里说说我个人的另外一点看法,大量使用static是对static的误用,我们学习编程语言的时候往往只注重了语法和语义,而忽视了语言的另一个重要要素“语用”,也就是该在什么情况下使用。楼主说的这种情况就是对static的语用不了解而造成的。

Static的语法就不用说了,语义就是不用创建类而可以直接使用,是类所共有的东西,所有的类的实例都共用的。但语用是什么呢?该在什么情况下使用呢?还是先了解一下语义和语用吧,语义是反映结构内部的关系,而语用则反映了结构成分同外部世界具体事物之间的联系,是结构外的关系。也就是说关系到对象内部状态的属性或操作就不能是static的,而与外部对象的操作不会涉及到对象内部状态的就可以是static的,所以有一些工具类方法就是static的,java本身也有这样的例子,如Integer.parseInt,System.out.print等。

killer 这么一说明白多了!

请教banq
我看过一些开源的系统,把一些公用的信息,如数据库连接url等放到配置文件中,在系统启动的时候,用一个单例的类加载配置文件,读取url等信息.因为这个类是单例的,所以url等信息也在整个系统中只有一份.取省资源.但有一疑问,单例的对象不会被回收吗?

我觉得new是完全的自由,无论是各种创建模式还是ioc,都只是实现了一种规范,规范让人好理解,一定制度的遵守可以更好的发挥出面向对象的技巧,但规范是建立在自由基础上的~~
所以不怎么认为是new的问题,个人设计风格与技巧的作用而已


楼上的问题我也想问题我也想知道答案,singletom的static方法的自身引用算不算在gc的引用之内,GC的引用是不是只有栈里引用才算

个人感觉,由于静态成员存储位置的不同,应当是不会被垃圾回收的;
它的生命周期应当随着所在类被java类装载器装载的时候开始,随该类的释放而释放,跟实例没关系;
一般来讲类装载进来了,如果不去改变它的话,
基本上是不会被释放了,直到整个进程的结束。
[该贴被confuse于2008-04-16 00:21修改过]