如果我希望在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(); } } 

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

myClass1.kt

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

myClass2.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(); } } 

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

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

然而,在你的例子中,你可能想要在上下文可用的时候调用这个方法。 那么,我会建议使用扩展。

 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) } 

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