Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Android 如果不总是需要变量,使用lambda是否更好?_Android_Kotlin_Memory Management_Lambda_Android Viewmodel - Fatal编程技术网

Android 如果不总是需要变量,使用lambda是否更好?

Android 如果不总是需要变量,使用lambda是否更好?,android,kotlin,memory-management,lambda,android-viewmodel,Android,Kotlin,Memory Management,Lambda,Android Viewmodel,我有一个类,无论发生什么都可以加载,但只要单击就需要一个参数。总是将参数传递给类还是传递lambda并在单击时调用它更好 例如: class ItemViewModel(item: ProductItem, private val index: Int, private val title: String?){ fun onItemClick() = foo(title) } 或 您的问题和代码示例是一体的

我有一个类,无论发生什么都可以加载,但只要单击就需要一个参数。总是将参数传递给类还是传递lambda并在单击时调用它更好

例如:

class ItemViewModel(item: ProductItem,
                    private val index: Int,
                    private val title: String?){
    fun onItemClick() = foo(title)
}


您的问题和代码示例是一体的

  • 如果不总是需要变量,使用lambda是否更好? 如果您使用的是Kotlin(在您的示例中),则可以通过使用
    标记将参数设置为可选参数(您正在这样做)。 这意味着此函数的调用者可以将
    null
    作为值传递,并且该函数应按预期工作
  • 现在,如果您提前知道客户端将传递
    null
    (或某个值),并且您不在乎它们是否传递,并且您想让客户端更容易调用此函数而不必传递参数,那么您可以将参数标记为
    ?=空
    。 例如:

    class ItemViewModel(item: ProductItem,
                        private val index: Int,
                        private val title: String? = null){
        fun onItemClick() = foo(title)
    }
    
    但是请记住,对于本例,函数
    foo
    还必须接受一个可能的
    null

    或:

    这意味着您现在可以将其称为
    ItemViewModel(ProductionItem.SomeItem,1)
    。不需要第三个参数(但如果您确实传递了一个参数,则仍然接受该参数)

  • Lambda参数通常只用于表示您需要的参数应该是回调。换句话说,您将传递一个lambda来表示“onComplete”,并让客户端处理
    foo
    函数的响应

  • 按照惯例,您不会将参数(不是回调)作为lambda传递。当然,你可以做到,但这是一种非常奇怪的方式,没有人会理解你为什么这么做

  • 如注释中所述,lambda通常比变量占用更多内存(除非您的变量是序列化对象,如图像或类似对象)


  • 我真的很困惑:)展示你正在谈论的代码,不要害羞。此外,传递“变量”通常不需要担心(假设您不打算创建4GB字符串…)。这不是一个非常紧迫的问题,在我写这篇文章时,我认为答案将是传递变量,因为它更具可读性。我更喜欢lamba方法,但在大多数情况下,这不重要,更多的是基于具体情况。似乎您担心过早优化。依我看,您应该始终努力编写一个简单而干净的代码,然后担心(在大多数情况下您不担心)任何优化。通过老式的方式传递前两个参数,然后将最后一项作为lambda传递,这可能会打破人们可能会说的“规范”。在本例中,使用lambda而不是传统方法不会带来性能方面的好处。TBH,该类不提供读者信息,因为它需要3个参数。If首先会担心分离关注点,即担心使其更具内聚性。Lambda实际上可能比字符串花费更多内存,因为在JVM字节码中,它由
    对象表示。默认值或null在这种情况下不起作用,因为用户可以随时单击该项。我不知道何时初始化用户是否要单击。最好的做法似乎是始终传递字符串以保持清晰,并防止不必要地创建更大的对象。对不起,我试图解释如何设置默认值,因为这是OP询问的问题之一。实际用例可能是一个错误的例子。
    
    class ItemViewModel(item: ProductItem,
                        private val index: Int,
                        private val title: String? = null){
        fun onItemClick() = foo(title)
    }
    
    class ItemViewModel(item: ProductItem,
                        private val index: Int,
                        private val title: String? = "Default title"){
        fun onItemClick() = foo(title)
    }