2016-09-19 8 views
1

私はこのKotlinにKotlinで匿名のクラスを表現する簡単な方法はありますか?

object : Thread("Cute Thread") { 
    override fun run() { 
    val a = 3 
    } 
}.start() 

を、このJava

new Thread("Cute Thread") { 
    public void run() { 
    int a = 3; 
    } 
}.start(); 

翻訳しかし、私はしかし、私はすべての例を見つけることができない、これを行う簡単な方法があることを感じています。

私は

Thread("Cute Thread") { val a = 3 }.start() 

しかしなしの成功と

...

PSを試してみました。私はこのようなスレッドを開始することは悪い習慣であることを知っています。

答えて

1

1つの問題は、Threadクラスのコンストラクタは、内のパラメータを持っているということですKotlinのための悪い順序。 Runnableの場合、SAM conversionの単一メソッドインタフェースはラムダとして扱うことができます)を使用することは簡単ですが、ラムダは最後のパラメータではないため、ちょっと奇抜です。唯一つのパラメータがある場合、それは結構です。

Thread({ val a = 3 }, "some name").start() 

しかし
Thread { val a = 3 }.start() 

つ以上のパラメータを指定して、彼らは後方かっこ内のパラメータとしてラムダでこの醜い構文を引き起こしています

代わりに、あなたはの簡単な構文を持っている機能ではKotlin STDLIB機能thread()

を使用する必要があります。 thread() function documentation

+0

驚くばかり!ありがとう! – PedroD

+1

@ PedroDの回答が近代化されました –

1

あなたが拡張/あなたの匿名クラスにいくつかのクラス/インタフェースを実装する場合よりも、他に方法はありません。できるだけ簡単な工事はもちろんである

object: Thread("Name"){ 
    //... 
}.start() 

val adhoc = object{ 
    // some code here 
} 

が、そこには、これを行う簡単な方法ではありません。

Documentationしかし、おそらくそれを読んでください。

4

匿名クラスを実装する方法は異なります(SAM conversionsを除く)。
しかし、あなたはまだして、コードを単純化することができます

Thread({ val a = 3 }).start() 

またはスレッド名を持つ:

Thread({ val a = 3 }, "Cute Thread").start() 
+1

あなたは問題(匿名クラスの構文)にソリューションを提供していないのではなく、別の方法では、 'Thread'クラスを使用する:

// create thread, auto start it, runs lambda in thread thread { val a = 3 } // create thread with given name, auto start it, runs lambda in thread thread(name = "Cute Thread") { val a = 3 } // creates thread that is paused, with a lambda to run later thread(false) { val a = 3 } // creates thread that is paused with a given name, with a lambda to run later thread(false, name = "Cute Thread") { val a = 3 } 

も参照してください。 – nhaarman

+0

@nhaarmanあなたは彼の問題が、より短い匿名のクラスか、一般に短いコードであると確信していますか?もしあなたが主人公の純粋主義者なら、あなたは正しいのですが、彼の本当の意図を理解するために努力すれば、あなたは間違っているかもしれません:「しかし、私はこれを行うより簡単な方法があると感じます。 – mklimek

+0

はい、私の目標は、コードを短くすることでした、ありがとう!申し訳ありませんが私は私の質問ではっきりしていない場合。私は、読みやすさに影響しない限り、すべてのコードが少ないです。それが私がJavaからKotlinに行く主な理由でした。 – PedroD

2

あなたのコードは絶対に正しいです。それを単純化する唯一の方法は、それを再利用し、関数にロジックを抽出し、次のとおりです。

fun newThread(name: String, block:() -> Unit): Thread { 
    return object : Thread(name) { 
     override fun run() = block() 
    }.start() 
} 

使用法:ここ

newThread("Cute Thread") { 
    val a = 3 
} 
+2

あなたがこのような機能を書こうとしているのであれば、既にstdlibにあなたが用意しているものがあります:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html – Ilya

関連する問題