📄 substitute.java
字号:
//Substitute.java
//本例创建一个symbol类,与每一个symbol绑定的类只有单一的实例。
//symbol类定义了readResolve方法,从外边创建创建一个symbol类时,
//调用symbollookup方法,如果该符号已存在时,返回该符号,不存在时创建它。
//这样确保虚拟机中符号唯一性。
//当符号开始读时,调用readResolve方法,已有的Symbol对象利用哈希表结构
//(hashtable)进行唯一性管理。
//打印两个符号是否用相同名字串行化
import java.io.*;
import java.util.*;
public class Substitute
{
//一般,串行化和非串行化两个符号用相同的名字说明它们就是相同的符号
public static void main(String args[])
{
//创建几个串行化的symbol类
Symbol s1 = Symbol.symbolLookup("blue");
Symbol s2 = Symbol.symbolLookup("pink");
Symbol s3 = Symbol.symbolLookup("blue");
//用它们非串行化符号
Symbol obj1 = null, obj2 = null, obj3 = null;
//串行化符号
try {
FileOutputStream fo = new FileOutputStream("symbol.tmp");
ObjectOutputStream so = new ObjectOutputStream(fo);
so.writeObject(s1);
so.writeObject(s2);
so.writeObject(s3);
so.flush();
}
catch (Exception e)
{
System.out.println(e);
System.exit(1);
}
//非串行化符号
try {
FileInputStream fi = new FileInputStream("symbol.tmp");
ObjectInputStream si = new ObjectInputStream(fi);
obj1 = (Symbol) si.readObject();
obj2 = (Symbol) si.readObject();
obj3 = (Symbol) si.readObject();
}
catch (Exception e)
{
System.out.println(e);
System.exit(1);
}
//显示唯一性
if (obj1 == obj3) {
System.out.println("Symbol1 and Symbol3 are the same!");
}
}
}
class Symbol implements Serializable
{
String symbolname;
//哈希表结构是静态的 (Hashtable是static),
//因为对任一对象都用同一个哈希表
static Hashtable ht = new Hashtable();
static Symbol symbolLookup(String symname)
{
if (ht.containsKey(symname))
{
return (Symbol)(ht.get(symname));
}
else
{
Symbol newSym = new Symbol(symname);
ht.put(symname, newSym);
return(newSym);
}
}
private Symbol (String name)
{
symbolname = name;
}
public Object readResolve() throws ObjectStreamException
{
if (!ht.containsKey(symbolname))
ht.put(symbolname, this);
return (Symbol) (ht.get(symbolname));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -