gpt4 book ai didi

用于包装方法的 Java 注释

转载 作者:IT老高 更新时间:2023-10-28 21:12:23 27 4
gpt4 key购买 nike

我有很多基本上遵循这种模式的样板代码:

function doSomething() {
try {
[implementation]
[implementation]
[implementation]
[implementation]
} catch (Exception e) {
MyEnv.getLogger().log(e);
} finally {
genericCleanUpMethod();
}
}

我很想创建自己的注释来清理我的代码:

@TryCatchWithLoggingAndCleanUp
function doSomething() {
[implementation]
[implementation]
[implementation]
[implementation]
}

方法签名差异很大(取决于方法的实际实现),但样板的 try/catch/finally 部分始终相同。

我想到的注解会自动用整个 try...catch...finally hoopla 包装被注解的方法的内容。

我到处寻找一种直接的方法来做到这一点,但一无所获。我不知道,也许我只是看不到所有带注释的树木的树林。

任何关于我如何实现这种注释的指针将不胜感激。

最佳答案

为此,您需要一些 AOP 框架,该框架将在您的方法周围使用代理。该代理将捕获异常并执行 finally block 。坦率地说,如果你还没有使用支持 AOP 的框架,我不确定我是否会使用一个来保存这几行 od 代码。

不过,您可以使用以下模式以更优雅的方式执行此操作:

public void doSomething() {
logAndCleanup(new Callable<Void>() {
public Void call() throws Exception {
implementationOfDoSomething();
return null;
}
});
}

private void logAndCleanup(Callable<Void> callable) {
try {
callable.call();
}
catch (Exception e) {
MyEnv.getLogger().log(e);
}
finally {
genericCleanUpMethod();
}
}

我刚刚使用了Callable<Void>作为接口(interface),但您可以定义自己的Command界面:

public interface Command {
public void execute() throws Exception;
}

从而避免使用通用 Callable<Void>并从 Callable 返回 null。

编辑:如果你想从你的方法中返回一些东西,那么让 logAndCleanup()方法通用。这是一个完整的例子:

public class ExceptionHandling {
public String doSomething(final boolean throwException) {
return logAndCleanup(new Callable<String>() {
public String call() throws Exception {
if (throwException) {
throw new Exception("you asked for it");
}
return "hello";
}
});
}

public Integer doSomethingElse() {
return logAndCleanup(new Callable<Integer>() {
public Integer call() throws Exception {
return 42;
}
});
}

private <T> T logAndCleanup(Callable<T> callable) {
try {
return callable.call();
}
catch (Exception e) {
System.out.println("An exception has been thrown: " + e);
throw new RuntimeException(e); // or return null, or whatever you want
}
finally {
System.out.println("doing some cleanup...");
}
}

public static void main(String[] args) {
ExceptionHandling eh = new ExceptionHandling();

System.out.println(eh.doSomething(false));
System.out.println(eh.doSomethingElse());
System.out.println(eh.doSomething(true));
}
}

编辑:使用 Java 8,包装的代码可以更漂亮一些:

public String doSomething(final boolean throwException) {
return logAndCleanup(() -> {
if (throwException) {
throw new Exception("you asked for it");
}
return "hello";
});
}

关于用于包装方法的 Java 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8657941/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com