gpt4 book ai didi

java - 在 `syncExec` block 内部和外部使用变量的最简单方法(或者,如何在不初始化的情况下存储对对象的最终引用)

转载 作者:行者123 更新时间:2023-12-01 21:53:22 24 4
gpt4 key购买 nike

我在这个例子中成功使用了AtomicReference(我发现的第一件事是有效并且可读的),但是因为我也使用了syncExec以及外部的部分在 block 完成执行之前不会到达同步块(synchronized block),我真的不需要引用是原子的。这似乎有些过分了。

final AtomicReference<Custom> result = new AtomicReference<>();

PlatformUI.getWorkbench().getDisplay().syncExec( () -> {
Custom custom = getSomeCustom();
custom.doSomething();
result.set(custom);
});

Custom c = result.get();
c.doSomethingElse();

我尝试使用常规引用,但无法使其工作:

final Custom c;

PlatformUI.getWorkbench().getDisplay().syncExec( () -> {
c= getSomeCustom();
c.doSomething();
});

c.doSomethingElse(true);

它在 getSomeCustom() 调用中输出无法分配最终局部变量 view,因为它是在封闭类型中定义的

我也尝试过使用 Reference 及其实现,但它们似乎不是我正在寻找的(这是最易读和基本的方法)。有谁知道如何在不使用 AtomicReference 的情况下实现这一目标?

最佳答案

我建议定义一个接受Supplier的自定义静态方法:

public class UIUtils {
static <T> T syncExec(Supplier<T> supplier) {
Object[] obj = new Object[1];
PlatformUI.getWorkbench().getDisplay().syncExec( () -> {
obj[0] = supplier.get();
});
return (T)obj[0];
}
}

由于使用单元素数组,它有点脏,但您只需要编写此方法一次。之后您可以使用:

Custom c = UIUtils.syncExec(() -> {
Custom custom = getSomeCustom();
custom.doSomething();
return custom;
});

c.doSomethingElse();

关于java - 在 `syncExec` block 内部和外部使用变量的最简单方法(或者,如何在不初始化的情况下存储对对象的最终引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810916/

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