Java

Java 序列化的问题之二——单例

第二个问题是如何读取应该是单例(Singleton)的序列化数据?当然要保证一是单例,二是数据正确性。Google 出来的所有文章都是一个调:private Object readResolve() { return getInstance(); }。方法没错,肯定要使用 readResolve() 返回一个唯一的实例。但真的可行吗?看下面的程序:

  1. WrongSingletonObject.java
  2.  
  3. public class WrongSingletonObject implements Serializable {
  4.     private static WrongSingletonObject instance;
  5.  
  6.     private String value = "value1";
  7.  
  8.     private WrongSingletonObject() {
  9.     }
  10.  
  11.     public static synchronized WrongSingletonObject getInstance() {
  12.         if (instance == null) {

Java 序列化的问题之一——自定义的类加载器

项目中间用到了 Java 序列化,但碰到了几个问题,可以说道说道。

由于涉及到问题以及解决方法有些繁杂,所以用一套例子来演示各种情况,项目以 [Ant] 编译运行。目录文件如下:

  1. CustomObject.java // 就是我们的主角了,它本身是在缺省的类路径,但其子类都是单独的 jar
  2. |-- SubCustomObject.java // 第一个子类
  3.     |-- plugin1.properties // 第一个子类所对应的信息,让加载器读取
  4. |-- AnotherSubCustomObject.java // 第二个子类
  5.     |-- plugin2.properties // 同上
  6.  
  7. // 主程序
  8. SerializationTest.java
  9.  
  10. // 单例类
  11. CustomObjectUtils.java
  12. // 自定义的类加载器
  13. CustomClassLoader.java
  14.  
  15. // 最简单的对象容器
  16. SimpleCustomObjectHolder.java
  17. // 将包含的对象在序列化时转换成 String,并在逆序列化时再转换回来。
  18. CustomObjectHolder.java
  19. // 列表容器,演示 Collection

Java 的字体替换

不知道什么时候起,中文的斜体和粗体开始流行起来,还有很多人还特意地去追求这种效果。中文写作的习惯是不用斜体和粗体的,而是使用完全不同的字体来区别不同的内容,一般是楷体对应斜体,黑体对应粗体。对于英文来讲,斜体粗体或者粗斜体和正常的字体也是不同的字体,需要重新设计,但都属于同一族(Family)的。对于汉字,这种效果一般是使用一定的算法将字体倾斜或者加粗(当然这种算法并不只是针对汉字)。

JSON Java API 的一个 bug

用到 [JSON] 的官方 [Java API] 时,遇到了一个 bug,当解析“{"a":[a,b,”,会导致 OutOfMemoryException。简单来说,就是整个 JSON 字符串中,以一个不完整的 JSON Array 结尾并且最后一个有效字符是逗号时,会引发这个问题。补丁如下:

  1. --- src/org/json/JSONArray.java 2008-02-02 06:59:17 +0000
  2. +++ src/org/json/JSONArray.java 2008-02-02 10:42:30 +0000
  3. @@ -122,8 +126,11 @@
  4.              switch (x.nextClean()) {

“在 Java 中使用 GNU gettext 实现本地化(L10N)”上线

在使用中发现 Java I18N 和 L10N 也不是那么方便,后来改用了基于 GNU gettext 的 Gettext-Commons,发现还不错,给大家介绍一下,能减少一些工作量。点击[这里]阅读。

在 Java 中使用 GNU gettext 实现本地化(L10N)

Java 本身已经可以很好地国际化(I18N),SUN 网站上也有关于国际化的[教程][文档],其中也包含了如何进行本地化(L10N)的过程。这里所谈的本地化指的是显示出来的字符串的本地化,不涉及数字、货币、日期时间等。Java 本身是如何进行本地化的呢?看一个简单的例子:

  1. I18NExample.java:
  2.  
  3. package org.supermmx.example.i18n;
  4.  
  5. import java.util.Locale;

输入中文以后 Java 并不退出

以前似乎也发现过,不过都没有注意,今天是在一个很简单的情况下出来的,然后稍微试验了一下就发现,在输入中文以后,程序就不能正常退出了,当然,没有直接使用 System.exit() 方法来暴力退出。这里说一下 Java 的退出方法,一般有两种:

  • 调用 System.exit():这就直接让 JVM 退出,相对来讲比较暴力,它不管你还有其他什么线程在运行,直接退出。

JComboBox 的编辑器

在给 JComboBox 一个树形列表的时候,想让它既可以下拉选择又可以直接输入一些东西,但发现似乎有点难以实现。选择框里显示的东西可以用自定义的 renderer 解决,但编辑器可就有点不好解决。JComboBox 里面的选项都是自定义的对象,所以设置到编辑器里要想显示正确就必须写 toString() 方法。

JSSE 中的 TrustStore

安装 [OpenFire] 的时候,在安全一项中加上了 TLS/SSL 的支持,这样它就会生成 DomainName_rsaDomainName_dsa 两份证书,当然这是自己签发的。那么在连上去以后就必须使用 TLS/SSL 来进行验证。但是中间抛了异常如下:

  1. [java] Caused by: sun.security.validator.ValidatorException: PKIX path building failed:
  2.               sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
Syndicate content