2017-09-18 67 views
1

我知道Kotlin沒有靜態函數,所以我在myClass1.kt和myClass2.kt中寫了兩個代碼。我不知道哪個更好,你能告訴我嗎?我不知道哪個更好,你能告訴我嗎?謝謝!如果我希望在Kotlin中使用類似靜態函數的語法,哪種方法更好?

主要

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

回答

2

讓我們反編譯的字節碼科特林看到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(); 
    } 
} 

第二種方法顯然不是你的原意。有一個不需要的實例創建。

0

其實任何一個是去OD。用例主要取決於方法的可見性。在第二種情況下,您可以進行更多的可見性控制,因爲它不受包裝的限制(如第一種)。我相信第一種情況會迫使你將.kt文件放在最高級別的包中,以便在代碼中隨處使用。

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

你能否解釋爲什麼第二種方式不好? – pokemzok

+1

@pokemzok首先,第二種方法是一種對象方法,甚至不是靜態的(Kotlin需要伴侶對象)。即使它是伴侶對象,這不是Kotlin的做法,更像Java。此外,它可以用較少冗長的'context?.display1()'工作在可空對象上。此外,你正在創建一個沒有目的的工具類。將職能放在課堂外可以達到同樣的目的。 – Joshua

相關問題