在这里使用@lombok.Cleanup的正确方法是什么?

时间:2017-08-01 15:41:45

标签: java lombok intellij-lombok-plugin

之前的代码是这样的 -

    try {
         some other code
         ......
         ......
            ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
            DataInputStream dis = new DataInputStream(annoBais);
            InputStream annoStream = dis;
            inputRecord.put("XMLStream", annoStream);
            MappedRecord resultMappedRecord = (MappedRecord)interaction.execute(interactionSpec,inputRecord);
            HashMap mappedAnnotIds =  (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
            annoStream.close(); //closed here
            annoBais.close();   // closed here
            dis.close();     // closed here
         ......
         ......
         some more code 
        }

我把它改为 -

 try {
some other code
......
......                
@lombok.Cleanup ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
@lombok.Cleanup DataInputStream dis = new DataInputStream(annoBais);
@lombok.Cleanup InputStream annoStream = dis; 
inputRecord.put("XMLStream", annoStream);
MappedRecord resultMappedRecord (MappedRecord)interaction.execute(interactionSpec,inputRecord);
HashMap mappedAnnotIds = (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
......
......
some more code 
}

@ lombok.Cleanup是否会拥有相同的范围?它会在之前手动关闭的地方关闭吗?如果没有,我怎么能以仍然具有相同范围的方式关闭它?

2 个答案:

答案 0 :(得分:1)

在这里使用@lombok.Cleanup的正确方法是不使用lombok; Java7用try with resources解决了这个问题。

例如,使用您的代码:

     some other code
     ......
     ......

     try (  ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
            DataInputStream dis = new DataInputStream(annoBais) ) {
        InputStream annoStream = dis;
        inputRecord.put("XMLStream", annoStream);
        MappedRecord resultMappedRecord = (MappedRecord)interaction.execute(interactionSpec,inputRecord);
        HashMap mappedAnnotIds =  (HashMap)resultMappedRecord.get(("ResultHashMap").toString());
     }
     //  annoBais & dis get closed here.
     //  Note: annoStream is an alias of dis, not a separate resource.
     ......
     ......
     some more code 

当然,此代码需要被try {} catch () {}块包围,或者您的方法必须声明它throws所需的例外。

使用"尝试使用资源"不会导致您必须处理其他异常。您总是需要处理所有已检查的异常,方法是捕获它们或声明您的方法抛出它们。

答案 1 :(得分:1)

使用

@lombok.Cleanup ByteArrayInputStream annoBais = new ByteArrayInputStream(annoBytes);
@lombok.Cleanup DataInputStream dis = new DataInputStream(annoBais);
@lombok.Cleanup InputStream annoStream = dis;

所有三个资源都在结束时以与其声明相反的顺序关闭。 AFAIK,与try-with-resources完全相同。

@Cleanup即使在某些关闭语句抛出时也能正常工作。这也是一样的。

它甚至适用于Java 6,但你真的不应该使用Java 6.

@Cleanup具有更好的语法,但这是主观的。我正在停止使用它,因为try-with-resources是一个内置功能,肯定会得到永久或类似的支持。

  

同样使用try with resources会导致我处理其他一些例外。

绝对不是,这也必须是一样的。请注意,99%的情况下,您应该将该异常添加到throws子句中,或者将其包装并重新抛出。

请注意

@lombok.Cleanup InputStream annoStream = dis;

毫无意义,因为您没有获得新资源。所以

 InputStream annoStream = dis;

会更好,因为没有什么新东西可以关闭。更好的是抛弃annoStream,因为在一件事上有两个变量几乎没有意义。

幸运的是,多次调用close是无害的。