2016-08-05 12 views
7

どの解決策が良いですか?空のラムダを使用するか、空のラムダをデフォルトのパラメータとして渡しますか?何とか空のラムダを最適化するでしょうか?何もしない新しいインスタンスを作成しますか?デフォルト値としてnullまたは空のラムダ

class Test1(val action:() -> Unit = {})

残念ながら、私は、生成されたバイトコードを理解していません。この

var1 = (Function0)null.INSTANCE;

編集のようなものを逆コンパイルは私たちに

private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null);

を与えた後、最終的にラムダが渡されるよう

val test11 = Test1()

を分析することができます: 隠し質問があります:コトルはどのように空を扱うのですか?デフォルト値としてのラムダ?

+0

あなたが達成しようとしているもの、または最適化しようとしているものによって、どちらの方が良いでしょうか? – miensol

+1

私は、不要な、空のインスタンスを持っていないと思います。私は最も簡単な解決策はNULL可能なラムダを持つことですが、それは醜い構造の '' 'アクション?.vvv()' ''を意味します。 –

+0

@PawełByszewski '' 'class Test1(val action:() - > Unit = {})' ''に関するあなたの懸念は何ですか? – ruX

答えて

10

ラムダパラメータのデフォルト値としてnullではなく空のラムダを渡すことは間違いありません。

IntelliJ IDEAで使用されている逆コンパイラは、常にKotlinバイトコードを処理するとは限りません。したがって、この場合の出力で実際に何が表示されるかは実際には反映されません。実際には、空のラムダは、空のボディに対応するFunctionNインターフェイスを実装するシングルトンネストされたクラスにコンパイルされ、シングルトンインスタンスがデフォルト値として使用されます。

デフォルトパラメータがKotlinでどのように実装されているかについては、my talk slidesを参照してください。

+2

ラムダが空であるかどうかチェックする方法? – Sunstrike

+0

@Sunstrikeそれを行う方法はありません。なぜあなたはそれが必要だと思いますか? – yole

+0

質問を開いたhttps://stackoverflow.com/questions/45799825/how-to-check-lambda-emptiness-in-kotlin とおそらく解決策を得ました – Sunstrike

関連する問題