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