Archive for the ‘Java’ Category
Monday, August 25th, 2008 | 72 views
之前的一篇文章:设计模式学习笔记:单例(singleton)模式主要介绍了单例模式的概念,及在Java中的实现,并给出了多线程环境的解决方法。
习惯上,保证一个类的实例是唯一的,主要通过使得构造器私有,通过静态工厂方法来控制实例的产生。这样做常常是有效的。但是,它并不能够真正保证类的实例是唯一的,因为,要产生一个类的实例,不一定需要经过构造器(Java语言的前提下)。
假使这个类或者其父类实现了Serializable接口,要保证该类实例的唯一性就不是那么简单了。首先,在Java1.2之前的版本中,我们是没有办法保证它唯一性的。因此,一个单例的类不应当实现Serializable接口。在Java1.2和之后的版本,开始有了解决的方法。我们需要提供一个readResolve方法,在Effective Java第57条建议中,保证singleton的readResolve方法如下:
1
2
3
| private Object readResolve() throws ObjectStreamException{
return INSTANCE;
} |
还有一种创建实例不需要经过构造器的情况是类或者父类声明了Cloneable接口,这个时候有必要重载clone方法来保证唯一性。
1
2
3
4
| public Object clone(){
return this;
// or throw CloneNotSupportedException;
} |
Posted in Java, 设计模式 | 2 Comments »
Monday, August 18th, 2008 | 177 views
在网上随便逛,看到一个有趣的讨论:对象与实例的区别。作者是这样认为的:
表现出来是这样的
String 类
String str str是对象
String str = “abc”; “abc”是实例,也是对象.
这样也能解释instance of object这种说法 str的实例是”abc”
文章是在Java的背景下讨论的,我觉得这样的理解是不对的。说他不对,是因为这样的理解违反常识。”对象”,”实例”这两个词在Java中并没有非常严格,细致的定义。因此,应当从常识的角度去理解他们。
我的理解是这样的:对象是某个东西的实例。这句话简化一下,就是对象是实例。任何一个对象,它必定是某个东西的实例。而”某个东西”,我们在Java语言中,可以认为它是类(Class),而在其他地方,比如Semantic Web的一些规范中,如RDF我们可以将其认为是一个概念。在RDF中,概念的一个实例依然是一个概念。
在Java语言的前提下,我觉得对象跟实例所指向的东西是没有分别的。
而在更宽广的条件下(比如,机器学习中的一些概念),那就不一定了。实例这个词表达了一种特化的过程。而对象,只是简单的是这种特化的产物。比如这样的一个概念特化过程:Thing->Animal->Human->Chinese->Chen Ju,我们可以看到Animal是Thing的一个实例,它是一个对象。同时Human是Animal的一个实例,它也是一个对象。也就是说,一个对象可以是另外一个对象的实例。
Posted in Java | No Comments »
Saturday, July 26th, 2008 | 220 views
前两天有位师弟问我,如何将写完的Java代码打包?由于他的源代码中使用了不少第三方的lib,因此有必要将lib也一并打包进去。他用Eclipse的Export功能直接打包到.jar文件,第三方lib是打包进来了,可是使用的时候还是提示找不到相应的包。
其实,为了自己的便利将别人发布的lib打包进自己project的包中不是一种合适的做法。这样做之前务必要检查一下对方的license,但不管是不是将对方的lib包括进来,既然自己的代码用到了,为了让它们正常工作,指明哪些包在那是必不可少的。师弟其实需要一个MANIFEST.MF文件,利用Eclipse生成jar文件的时候,请不要让其自动生成MANIFEST.MF,而是应当由你自己写好一个MANIFEST.MF,然后告诉 Eclipse:请使用这个文件。想了解细节,请阅读SUN的这篇规范(VIA),或者是IBM网站上的这篇JAR文件揭秘,偶这里就不多写了。
另外,Eclipse其实还有一个输出到可执行jar的功能,该功能能够帮你编写合适的MANIFEST.MF文件,帮你将你引用的第三方lib一并打包(注意license哦)。
Posted in Java | No Comments »
Saturday, July 26th, 2008 | 19 views
JSP学习笔记
JSP一共可以有三种方式包含其他页面:
1. < %@ include file=”target resource” %>
2.
3.
这3种方式是互相区别的。第一种方式下,该命令仅仅在一个JSP页面被编译的时候的才会调用,可以将其想象成inline的函数。target resouce的内容通过硬编码的方式整合到这个JSP生产的Serlvet中,之后对该页面的调用都与target resource无关了。因此,这种相对静态的方式,性能开销相对小一些。从定义上说,当A页面< %@ include file=”target resource” %>, target resource是B页面,当A编译生成Serlvet之后,B页面的改动不能够再从A页面中反应出来,除非重新编译。这是该种方式的最主要缺陷。不过当前一些主流的Web服务器能够检测到B页面的动态变化而重新编译A页面,不过,我们不能依赖于此。
第二种方式与第一种方式的区别就在于,每次该JSP页面被访问时,此动作都会执行一次。修正了前一种方式的缺陷,可以反映出target resource的动态变化,当然,前一种方式开销小的优势也没了。这两种方式的区别很像函数调用跟内嵌函数的区别。
第三种方式是利用了JSTL的核心库,c是该库url的简写。它的工作机制跟第二种方式是很相似的,只是功能更加强大。第二种方式的target resource只能是引用容器内部的,而第三种方式的target resource可以是任意url。
Posted in Java | No Comments »
Sunday, April 29th, 2007 | 1 views
在4月24号收到了第二书店快递来的这两本书,发现第二书店的快递速度比china-pub要慢上一两天。又是一笔饭钱没了。
25号就准备回家呆几天,代码大全太厚,而Effective Java这本较薄的书正好带在路上解闷。传说中此书的中文翻译的不错,因此放心的买了中文版。
翻译的是潘爱民老师,我没读过他翻的其他书,不过名声不小。这本书翻的确实还可以,至少能读,有问题的地方不多,我读了1/3,没有找到几处要引起误解的地方。
Effective Java的作者是JOSHUA BLOCH,记得他也是Java Puzzlers的作者,喜欢纠缠语言的细节,探寻Java内部各种微妙的小径,微妙的陷阱。所谓微妙,就是说这些细节并不直观,甚至与直观相反。我的观点是,钻研这些细节不同于研究如何写茴香豆的茴字,而是不可或缺的。这些种种微妙的细处,在浩瀚的Java代码中处处可见,假若对此不是心知肚明,开发一个健壮的,可用的系统是十分困难的。工欲善其事,必先利其器。如果需要用Java语言来开发,掌握这门语言的种种细节还是十分必要。而类似Java Puzzlers这些书籍向我们极好的展示了这门语言细节之处,Effective Java的角度似乎更高一点。想要好好使用Java,我想这些书都是需要关注一下的。
Posted in Java | No Comments »
Monday, December 18th, 2006 | 1 views
第一个是Jena,一个RDF和OWL的API,可以对RDF(Resource Description Framework)和OWL(Ontology Web Language)文件进行读写。在读的时候Jena提供了一种查询语言,比较方便。
另一个是Protégé,官方介绍说Protégé is a free, open source ontology editor and knowledge-base framework.Protégé,界面做的还可以,可是上手不是那么顺利,好多按钮不在它该在的地方,目前还用的不大熟悉。新版本(3.2+)的Protégé需要Java 1.5以上。
发现这些工具都是基于Java的,不知道其他语言有没有相关工具。
Posted in Java, Techs | No Comments »