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

如果我希望使用类似Kotlin中静态函数的语法,那么哪种方法更好?,kotlin,Kotlin,我知道Kotlin中没有静态函数,所以我在myClass1.kt和myClass2.kt中编写了两个代码 我不知道哪个更好,你能告诉我吗?谢谢 Main class HomeActivity : DemoActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout

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

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

Main

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();
}
import android.content.Context
import android.widget.Toast

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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

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

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

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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();
   }
}

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

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

绝对不是第二种方法。如果方法是对象的特定用例,那么第一种方法就可以了

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

fun Context.display1(){
    // In the function, `this` is refer to the context
    Toast.makeText(mContext, "Hello, World 1", Toast.LENGTH_LONG).show();
}
然后,在
活动中
,您可以像

fun example() {
    display1()
}
而不是

fun example() {
    Display1(this)
}

绝对不是第二条路。如果方法是对象的特定用例,那么第一种方法就可以了

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

fun Context.display1(){
    // In the function, `this` is refer to the context
    Toast.makeText(mContext, "Hello, World 1", Toast.LENGTH_LONG).show();
}
然后,在
活动中
,您可以像

fun example() {
    display1()
}
而不是

fun example() {
    Display1(this)
}

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

myClass1.kt

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

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

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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

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

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

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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();
   }
}

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

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

myClass1.kt

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

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

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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

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

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

object Utility {
    fun Display2(mContext: Context) {
        Toast.makeText(mContext, "Hello, World 2", Toast.LENGTH_LONG).show();
    }
}
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();
   }
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();
   }
}

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

@pokemzok首先,第二种方法是对象方法,甚至不是静态的(Kotlin需要伴生对象)。即使它是伴生对象,这也不是Kotlin的方式,更像Java。此外,它还可以处理不太详细的空对象,
context?.display1()
。此外,您正在创建一个没有目的的实用程序类。将函数放在类之外也可以达到同样的目的。@pokemzok首先,第二种方法是对象方法,甚至不是静态的(Kotlin需要伴随对象)。即使它是伴生对象,这也不是Kotlin的方式,更像Java。此外,它还可以处理不太详细的空对象,
context?.display1()
。此外,您正在创建一个没有目的的实用程序类。将函数放在类之外也可以达到同样的目的。