这只是Go代码的一个简短示例:
package main
import "fmt"
func main() {
defer fmt.Println("world") //use of keyword 'defer'
fmt.Println("hello")
}
我在Java中找到了一个等效的"defer"。
我可以使用而不是"推迟">
try {
//do something
} finally {
//code using defer
}
如果不使用try/catch/finally,还有其他选择吗?
Java7有一个try-with-resources语句。
try-with-resources语句是一个声明一个或多个资源的try语句。资源是程序使用完之后必须关闭的对象。try-with-resources语句确保在语句结束时关闭每个资源。任何实现java.lang.AutoCloseable的对象,包括实现java.io.Closable的所有对象,都可以用作资源。
以下示例读取文件中的第一行。它使用BufferedReader的实例从文件中读取数据。缓冲区读取是程序完成后必须关闭的资源it:
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
在本例中,try-with-resources中声明的资源语句是BufferedReader。此时会出现声明语句在try关键字后面的括号内。班级BufferedReader在JavaSE7及更高版本中实现了接口java.lang.AutoCloseable。因为BufferedReader实例是在try-with-resources语句中声明,它将被关闭不管try语句是正常完成还是突然完成(由于方法BufferedReader.readLine抛出IOException)。
在java7及以上版本中,您可以使用try-with-resource:
public static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
当您退出尝试时,它将关闭资源文档:链接
您也可以使用一些额外的库来执行类似的操作。不幸的是,有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();
}
}