有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

是否有一种优雅的解决方案或模式,可以将writeStartObject()的一次调用应用于Writer和OutputStream

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

共 (1) 个答案

  1. # 1 楼答案

    你可能想考虑这两个是否真的应该结合在一起,因为有内聚和耦合的指导方针要考虑。例如,如果您需要将writeroutputStream用于其他用途,并达到广泛的程度,那么您应该将它们分开,除非这种广泛的使用在这两种用途中得到了平等的反映。最好将它们隐藏在两个独立的Data Access Objects后面,在这两个独立的Data Access Objects中,它们的使用可以被划分开来,根据访问它们的目的以描述性的方式公开它们的操作——稍微更适合您的业务

    无论是有限的使用还是广泛的使用,为了在这两种情况下得到同等的使用,我可能会使用façade这样的:

    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会在新实例中引发data coupling,因为id是一段SimultaneousFeed不应该知道的数据。这允许SimultaneousFeed只关注输出数据,从而提高可重用性和可维护性

    可考虑的另一种模式是^ {A4}模式,前提是您能够对^ {CD10>}实例和^ {CD11>}类的子类进行分类。这将允许您创建一个自定义JsonGenerator,在writeStartObject()方法的重写实现中同时写入两个输出。在这种情况下,您可以在jfactory类中提供一个方法:

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