java中comparator实现序列化_java – 确保Function参数是可序列化的最好方式是什么?...
我正在編寫一個可序列化的類,它接受幾個參數,包括一個函數:
public class Cls implements Serializable {
private final Collection _coll;
private final Function _func;
public Cls(Collection coll, Function func) {
_coll = coll;
_func = func;
}
}
func存儲在成員變量中,因此需要可序列化. Java lambdas are serializable if the type they’re being assigned to is serializable.什么是最好的方法來確保我的構造函數中傳遞的函數是可序列化的,如果它是使用lambda創建的?
>創建一個SerializableFunction類型并使用它:
public interface SerializableFunction implements Function, Serializable {}
....
public Cls(Collection coll, SerializableFunction func) {...}
問題:
> coll和func參數之間現在不匹配,因為func在簽名中被聲明為可序列化,但是coll不是,但是都需要可序列化才能工作.
>它不允許Function的其他實現可序列化.
>在構造函數上使用一個類型參數:
public & Serializable>
Cls(Collection coll, F func) {...}
問題:
>比1更靈活,但更混亂.
>兩個參數之間仍然存在不匹配 – func參數是在編譯時類型的父進程中實現Serializable所必需的,但是coll只是需要以某種方式進行序列化(盡管如果需要可以將其刪除).
編輯當嘗試使用lambda或方法引用調用時,此代碼實際上不會編譯.
把它留給來電者
這需要調用者知道(從javadocs或者是試驗和錯誤)參數需要是可序列化的,并且適當地轉換:
Cls c = new Cls(strList, (Function & Serializable)s -> ...);
要么
Cls c = new Cls(strList, (Function & Serializable)Foo::processStr);
這是一個丑陋的IMO,并且使用lambda的初始天真的實現保證破壞,而不是像coll一樣工作(因為大多數集合可以以某種方式串行化).這也將類的實現細節推送到調用者.
目前,我傾向于選項2,作為對呼叫者施加最小負擔的那個,但是我不認為這里有一個理想的解決方案.任何其他建議如何正確地做到這一點?
編輯:也許需要一些背景.這是一個在storm中運行的類,它是一個螺栓,它被序列化以傳送到刪除集群來執行.該功能是在集群上運行時對已處理的元組執行操作.所以它是類的目的的很大一部分,它是可序列化的,并且函數參數是可序列化的.如果不是,則該類根本不可用.
總結
以上是生活随笔為你收集整理的java中comparator实现序列化_java – 确保Function参数是可序列化的最好方式是什么?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java xmlsec_找不到net.s
- 下一篇: 西湖卖酸梅汤的女子是哪里人啊?