如果我希望在Kotlin中使用类似静态函数的语法,哪种方式更好?

时间:2017-09-18 07:06:56

标签: kotlin

我知道Kotlin中没有静态函数,所以我在myClass1.kt和myClass2.kt中编写了两个代码

我不知道哪个更好,你能告诉我吗?谢谢!

主要

class HomeActivity : DemoActivity() {    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Display1(this)
        Utility.Display2(this)
    }
}

myClass1.kt

import android.content.Context
import android.widget.Toast

fun Display1(mContext: Context){
    Toast.makeText(mContext, "Hello, World 1", Toast.LENGTH_LONG).show();
}

myClass2.kt

import android.content.Context
import android.widget.Toast

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}

3 个答案:

答案 0 :(得分:3)

绝对不是第二种方式。如果方法是对象的特定用例,则第一种方法很好。

但是,在您的示例中,您可能希望在上下文可用时调用该方法。然后,我建议使用扩展名。

fun Context.display1(){
    // In the function, `this` is refer to the context
    Toast.makeText(mContext, "Hello, World 1", Toast.LENGTH_LONG).show();
}

然后,在Activity中,你可以像

一样写
fun example() {
    display1()
}

而不是

fun example() {
    Display1(this)
}

答案 1 :(得分:2)

让我们反编译kotlin字节码并查看java代码。

<强> myClass1.kt

public final class Utility {
   public static final Utility INSTANCE;

   public final void Display2(@NotNull Context mContext) {
      Intrinsics.checkParameterIsNotNull(mContext, "mContext");
      Toast.makeText(mContext, (CharSequence)"Hello, World 2", 1).show();
   }

   private Utility() {
      INSTANCE = (Utility)this;
   }

   static {
      new Utility();
   }
}

<强> myClass2.kt

urllib3

第二种方式显然不是你想要的。有一个不需要的实例创建。

答案 2 :(得分:0)

实际上,任何一个都是好的。用例主要取决于方法的可见性。在第二种情况下,您有更多的可见性控制,因为它不受包的限制(如第一种情况)。我相信第一种情况会强迫您将.kt文件放在最高的包中,以便在代码中的任何地方使用。