我有一个类似于以下内容的构造函数:
public SqlReader(Schema schema) {
super(schema::readRow,schema::initialize);
}
代码的主要部分可能如下所示:
Schema schema = new schema(schemaDefinition);
SqlReader sqlSource = new SqlReader(schema);
schema.groupBy(sqlSource,Column.column("market"),Column.sum("sales"));
result = schema.execute();
这是一段虚构的代码,允许我解释我们在这里处理延迟执行,其中schema.groupBy
将修改架构,SqlReader
取决于原始架构。
这里的问题是使用schema::readRow
,您将schema
的实际引用传递给成员引用,而不是它的副本,因为这会转换为您传递的匿名内部类schema
。
如何才能有效改善?
第一次尝试可能如下所示:
public SqlReader(Schema schema) {
super(schema.clone()::readRow,schema.clone()::initialize);
}
开销是显而易见的:现在我创建了两次克隆。所以我可能会提出这个解决方案,而不是在API(SqlReader)中,我在自定义编码部分进行:
SqlReader sqlSource = new SqlReader(schema.clone());
这里的问题是,现在我要求API的用户知道这个问题,这个问题可能过于复杂,无法让用户理解或记住。
所以我提出了一种新方法:使用工厂,构建器或静态创建器:
public static create(Schema schema) {
Schema schemaCopy = schema.clone();
return new SqlReader(schemaCopy::readRow,schemaCopy::initialize);
}
对于并行化流,Lambda和方法引用来说,这似乎是一个常见问题,必须有一种更优雅的方法来解决这个问题吗?