Я знаю, что в Котлин нет статической функции, поэтому я пишу два кода в 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-файл в иерархию наивысших пакетов, чтобы использоваться повсюду в вашем коде.