gpt4 book ai didi

java - 什么机制使外部变量可以在动态创建的类中访问

转载 作者:行者123 更新时间:2023-12-04 20:41:34 26 4
gpt4 key购买 nike

我有以下代码:

private void renderText(ArrayList<ArticleWord> words) {
final StringBuilder text = new StringBuilder();

tv.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.d("findWordForRightHanded", text.toString());
return false;
}
});

我不明白如何在 View.OnTouchListener< 的 onTouch 方法中访问在 renderText 方法中创建的变量 text/类?

当定义一个类并同时从该类创建一个新对象时,如何在 Java 中调用这种机制?

最佳答案

它叫做 variable capturing ,并且在基本层面上,它将对象创建时的变量值复制到合成字段。 (也就是说,一个由编译器自动生成的字段。)所以你的编译代码看起来有点像这样:

    final StringBuilder text = new StringBuilder();

tv.setOnTouchListener(new View.OnTouchListener(text) {
private final StringBuilder text;

private View.OnTouchListener(StringBuilder text) { // THIS IS NOT VALID SYNTAX, JUST DEMONSTRATING WHAT'S GOING ON BEHIND THE SCENES
this.text = text;
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.d("findWordForRightHanded", text.toString());
return false;
}
});

这就是变量需要是 final 或有效 final 的原因(后一个概念随 Java 8 一起出现,这意味着如果编译器可以确定您不会多次为变量赋值,那么您就不会必须显式声明它为 final),以便最终调用被覆盖的方法时该值仍然被认为是有效的。

此时需要注意的是,在非静态内部类中始终捕获的一件事是对 OuterClass.this 的引用,这就是为什么您最终会出现奇怪的内存泄漏的原因如果你不够小心。非静态内部类没有这样的问题,lambdas 也提供了更健壮的解决方案。

更新:抱歉,您问的是整个机制的名称,称为匿名类

关于java - 什么机制使外部变量可以在动态创建的类中访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027050/

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