可以重寫方法ObjectOutputStream.writeStreamHeader()
以將數據預加或附加到標題。但是,如果該數據是基於一個參數傳遞給派生類的構造函數,如:如何覆蓋ObjectOutputStream.writeStreamHeader()?
public class MyObjectOutputStream extends ObjectOutputStream {
public MyObjectOutputStream(int myData, OutputStream out) throws IOException {
super(out);
m_myData = myData;
}
protected void writeStreamHeader() throws IOException {
write(m_myData); // WRONG: m_myData not initialized yet
super.writeStreamHeader();
}
private final int m_myData;
}
這是行不通的,因爲之前m_myData
初始化和super()
電話writeStreamHeader()
super()
被調用。我能想到的唯一的辦法來解決,這是通過使用ThreadLocal
像:
public class MyObjectOutputStream extends ObjectOutputStream {
public MyObjectOutputStream(int myData, OutputStream out) throws IOException {
super(thunk(myData, out));
}
protected void writeStreamHeader() throws IOException {
write(m_myData.get().intValue());
super.writeStreamHeader();
}
private static OutputStream thunk(int myData, OutputStream out) {
m_myData.set(myData);
return out;
}
private static final ThreadLocal<Integer> m_myData = new ThreadLocal<Integer>();
}
這似乎是工作,但有一個更好的(不太笨重)的方式?
這比使用ThreadLocal更笨拙 – dfa 2009-07-06 07:46:02
這是如何笨重?構圖非常優雅。唯一的問題是所有的樣板代碼(方法體),因爲Java缺乏代表的好語法。但是Eclipse可以自動生成它們。 – Thilo 2009-07-06 07:48:34
@Thilo,我寧願你的解決方案使用流組合 – dfa 2009-07-06 07:51:41