JsonGenerator 可以在同一次调用中写入 OutputStream 和 Writer 吗?



是否有一个优雅的解决方案或模式,以便 writeStartObject() 的一个调用可以同时应用于编写器和输出流?

try (
JsonGenerator output = jfactory.createGenerator(outputWriter); // writer
JsonGenerator cachingOutput = jfactory.createGenerator(cachingService.getCachingOutputStream(id));//outputstream
) {
output.writeStartObject();
cachingOutput.writeStartObject();
...

您可能需要考虑这两者是否真的应该绑定在一起,因为需要考虑内聚和耦合准则。 例如,如果您需要将writeroutputStream用于其他用途,并且在很大程度上,那么您应该将它们分开,除非这种广泛使用在两者中得到平等的反映。 最好将这两个隐藏在两个独立的数据访问对象后面,在那里它们的使用可以划分,根据访问它们的目的以描述性方式公开它们的操作 - 更适合您的业务。

无论是有限使用还是广泛使用,为了在对中平等使用,我可能会应用这样的外观:

class SimultaneousFeed {
private JFactory jFactory;
private JsonGenerator out;
private JsonGenerator writer;
SimultaneousFeed(JFactory jFactory, OutputStream outputStream, Writer outputWriter) {
this.jFactory = jFactory;
this.out = jfactory.createGenerator(outputStream);
this.writer = jfactory.createGenerator(outputWriter);
}
void writeStartObject() {
out.writeStartObject();
writer.writeStartObject();
}
...
// other operations common to the pair of these outputs
}
...
SimultaneousFeed feed = new SimultaneousFeed(jFactory, cachingService.getCachingOutputStream(id),
outputWriter);
feed.writeStartObject();

请注意,我正在将OutputStream传递给新的SimultaneousFeed实例,而不是传递id。 传递id会在新实例中提高数据耦合 -idSimultaneousFeed应该一无所知的数据。 这允许SimultaneousFeed只关注输出数据,从而提高可重用性和可维护性。

要考虑的替代模式是装饰器模式,前提是您能够子类化jfactory实例的类和JsonGenerator类。 这将允许您创建一个自定义JsonGenerator,该在writeStartObject()方法的重写实现中同时写入两个输出。 在这种情况下,您可以在jfactory类中提供一个方法:

public JsonGenerator createSimultaneousGenerator(OutputStream outputStream, Writer outputWriter) {
return new SimulJsonGenerator(outputStream, outputWriter);
}

最新更新