我正在编写一个可序列化的类,它接受几个参数,包括一个函数:

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参数是可序列化的最好方式是什么?...相关推荐

  1. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

  2. Java面试之Java基础8——在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤

    在 Java 中定义⼀个不做事且没有参数的构造⽅法的作⽤,比如下面的代码: class Father {private String str;// 这个空构造方法有什么作用呢?Father(){}pu ...

  3. 39.在Java中定义一个不做事且没有参数的构造方法的作用?

    1 在Java中定义一个不做事且没有参数的构造方法的作用 Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会 调用父类中"没有参数的构造方法&quo ...

  4. java 中list类型未知_Java集合-List

    Java Collection 在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的A ...

  5. java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:

    1.简要介绍java程序的健壮性. 答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的垃圾回收机制也有效的避免了内存的泄漏. 2.为什 ...

  6. java 中random类使用_Java中的天使和魔鬼:Unsafe类

    我们在看ConcurrentHashMap源码时经常看到Unsafe类的使用,今天我们来了解下Unsafe类. Java是一个安全的编程语言,它能最大程度的防止程序员犯一些低级的错误(大部分是和内存管 ...

  7. java中的分层概念_Java分层概念

    1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分?(下面所描述的service层就是biz) 首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对 ...

  8. java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...

    synchronized关键字的意义是什么? 什么时候应该是方法synchronized? 这是什么编程和逻辑? Java中,"synchronized"(同步)是什么意思?什么时 ...

  9. java中缓冲区和缓存_Java中的Google协议缓冲区

    java中缓冲区和缓存 总览 协议缓冲区是一种用于结构化数据的开源编码机制. 它是由Google开发的,旨在实现语言/平台中立且可扩展. 在本文中,我的目的是介绍Java平台上下文中协议缓冲区的基本用 ...

最新文章

  1. Html5 History API解析
  2. 【宋红康学习日记3】运算符
  3. 五小步让VS Code支持AngularJS智能提示
  4. 深度学习核心技术精讲100篇(四十一)-阿里飞猪个性化推荐:召回篇
  5. 测试:脱离VS2010使用自动化测试时出现 6DA215C2-D80D-42F2-A514-B44A16DCBAAA 错误
  6. vue执行操作成功但页面不刷新_vue.js数据更新页面不刷新
  7. Windows Server 2008 Server Core模式
  8. c语言指针 r,C语言指针的高级操作
  9. mybatis在指定库建表_搭建MyBatis开发环境及基本的CURD介绍
  10. 斗牛/牛牛经典算法java版
  11. 苹果中国官网新增蚂蚁花呗 24 期分期免息服务
  12. 基于RNA的新型癌症疗法介绍
  13. Markdown快速入门
  14. JavaEE | 基本类型包装类
  15. matlab线性方程组求解
  16. JVM 相关 - 深入 JVM 的钥匙 WhiteBox API
  17. JsDelivr CDN缓存刷新工具-缓存清除-缓存更新
  18. 对“巴洛克式“(巴罗克式)的理解
  19. 【论文阅读】SCRDet:Towards More Robust Detection for Small, Cluttered and Rotated Objects
  20. 微软所有正版软件下载网站ITELLYOU_我是亲民_新浪博客

热门文章

  1. go的25个关键字(保留字)和36个预定标识符
  2. Linux find查找文件夹(目录)所在位置
  3. kustomize+argo
  4. docker history 27f1068ca9da --no-trunc查看镜像dockerfile内容
  5. minio安装及特性原理介绍
  6. 使用 LxRunOffine 迁移 WSL Ubuntu安装目录
  7. Webpack安装、打包过程及开发过程超详细教程(专治看不懂学不会)
  8. java中的重写与重载_java中的重写与重载
  9. vue项目获取下拉框选中id_vue treeselect获取当前选中项的label实例
  10. VS2015+OpenCV2.4.13环境搭建详细步骤及自带示例编译运行