Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们为什么要';获取一个稳定的引用';在Kotlin/Android中?_Java_Android_Kotlin_Android Camerax - Fatal编程技术网

Java 我们为什么要';获取一个稳定的引用';在Kotlin/Android中?

Java 我们为什么要';获取一个稳定的引用';在Kotlin/Android中?,java,android,kotlin,android-camerax,Java,Android,Kotlin,Android Camerax,我在读Android CameraX codelab: 简化的代码段如下所示: class MainActivity : AppCompatActivity() { private var imageCapture: ImageCapture? = null //(some other codes here...) private fun takePhoto() { // Get a stable reference of the modifi

我在读Android CameraX codelab:

简化的代码段如下所示:

class MainActivity : AppCompatActivity() {
    private var imageCapture: ImageCapture? = null
    
    //(some other codes here...)

    private fun takePhoto() {
        // Get a stable reference of the modifiable image capture use case
        val imageCapture = imageCapture ?: return
        
        //(some other codes here...)

    }
}
在codelab中,它说:

首先,获取对ImageCapture用例的引用

为什么在
takePhoto()
中需要新的参考
imageCapture

我们不能只使用
main活动中的
imageCapture

这是为了某种“最佳实践”的东西还是我遗漏了什么


任何建议都将不胜感激

它相当于空检查

stable reference -> Not null reference 
类似于

if(imageCapture==null) return;
在代码实验室,他们也提到了同样的事情

首先,获取对ImageCapture用例的引用。如果用例为null,则退出函数。如果在设置图像捕获之前点击“照片”按钮,此值将为空。如果没有return语句,应用程序将在其为null时崩溃

所以基本上你是在消除NPE的可能性,NPE可以通过多种方式完成,他们碰巧使用了另一个局部变量。也可以使用
let
完成

imageCapture?.let{
 // code goes here
   }
在这一行中,您将为imageCapture变量指定null。现在,当您开始使用takePhoto()时,编译器如何知道imageCapture不再为null

正如@ADM所描述的,您可以使用

imageCapture?.let{
  //your code goes here
}

如果你愿意的话。这基本上是确保你不会在一个空的对象上调用任何东西。

如果在另一个线程中的其他代码修改了<代码> IMAGEAPPACTION/COD>在代码的中间> TopPix< /Cord>??Louis Wasserman,我认为这只是一个引用,而不是复制,你认为会发生什么?所以修改后的<代码> IMACREPACTION <代码>将在中使用,即使在原来的CODELAB代码中,不是吗?在拍摄照片的中间,所以如果拍摄照片没有拍摄快照,则可以在功能的中间改变变量,这可能会导致混乱。@路易斯沃瑟曼,哦,你的意思是,拍摄“引用”的快照(克隆),而不是对象本身?好的,我明白了。因此,当您说“…如果另一个线程中的某些其他代码“修改”
imageCapture
…”时,“修改”意味着分配一个不同的对象,而不是修改原始对象本身。我理解对了吗?因此,如果原始对象本身在另一个线程中被修改(而不是重新分配),那么它将导致混乱,除非我们深度复制对象本身。如果我理解错误,请告诉我。谢谢你的评论!是的,没错。如果您正确地使用了不可变对象,那么引用的副本就是您所需要的。”…这可以通过多种方式完成,而且它们碰巧使用了另一个局部变量…”所以这只是避免NPE的众多方法之一,对吗?谢谢!现在我明白了,它不是等价的,
if(imageCapture==null)返回仍然没有帮助,如果变量在中间改变,你仍然会发生奇怪的事情,编译器将不允许非空<代码> .<代码>对对象进行调用,即使在同一方面也有这样的检查。代码>?。let
将进行浅层复制,与问题中的代码片段相同,这将不会受到外部更改的影响。即使变量在中间发生更改,浅层复制也将被更改。这就是为什么它们都是一样的。只有在克隆之后,我们才能确保本地引用不会受到实际引用的影响。
imageCapture?.let{
  //your code goes here
}