Java中的“defer”等效语句是什么?

10

这只是 Go 代码的简短示例:

package main

import "fmt"

func main() {
    defer fmt.Println("world") //use of keyword 'defer'

    fmt.Println("hello")
}

我正在寻找Java中与'defer'等效的方法。

可以使用以下替代方法,而不是使用'defer'

try {
    //do something
} finally {
    //code using defer
}

有没有不使用try/catch/finally的替代方案?


你想执行清理操作吗? - mbsingh
1
finally 有什么问题吗? - Radiodef
是的,清理工作像关闭连接和释放内存。 - Romeo
7
没有直接的翻译,而且你写 Go 的方式与你写 Java 不同。 - Paul Hankin
3个回答

12

Java 7有一个带资源的try语句

带资源的try语句是一个try语句,它声明了一个或多个资源。资源是在程序使用完毕后必须关闭的对象。带资源的try语句确保每个资源在语句结束时都会关闭。任何实现了java.lang.AutoCloseable接口的对象,包括所有实现了java.io.Closeable接口的对象,都可以用作资源。

下面的例子从文件中读取第一行。它使用BufferedReader类的实例从文件中读取数据。BufferedReader是一个必须在程序使用完毕后关闭的资源:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

在这个例子中,try-with-resources语句中声明的资源是BufferedReader。声明语句出现在try关键字之后的括号内。在Java SE 7及更高版本中,类BufferedReader实现了接口java.lang.AutoCloseable。由于BufferedReader实例是在try-with-resource语句中声明的,因此无论try语句是否正常完成或者是否因为方法BufferedReader.readLine抛出IOException而异常终止,它都将被关闭。


4
在Java 7及以上版本中,您可以使用try-with-resource:
public static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
     return br.readLine();
  }
}

当您退出try块时,它将关闭资源。

文档:链接

0
你也可以使用一些额外的库来做类似的事情。不幸的是,还需要处理 IOException 异常。
import com.google.common.io.Closer;
import lombok.Cleanup;
import lombok.SneakyThrows;
import java.io.IOException;

public class Main {

    @SneakyThrows(IOException.class)
    public static void main(String[] args) {
        @Cleanup Closer defer = Closer.create();
        defer.register(() -> System.out.println("world"));
        System.out.println("hello");
    }
}

如果你不喜欢处理异常,并且如果对你来说值得的话,你可以这样包装它。
import com.google.common.io.Closer;
import lombok.Cleanup;
import lombok.SneakyThrows;
import java.io.Closeable;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        @Cleanup Defer defer = Defer.create();
        defer.register(() -> System.out.println("world"));
        System.out.println("hello");
    }
}

// in some util package
class Defer implements Closeable {
    private final Closer closer;

    private Defer(Closer closer) {
        this.closer = closer;
    }

    public static Defer create() {
        return new Defer(Closer.create());
    }

    public <C extends Closeable> C register(C closeable) {
        return this.closer.register(closeable);
    }

    @SneakyThrows(IOException.class)
    @Override
    public void close() {
        this.closer.close();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接