質問

私のAndroidプロジェクトでは、ボタンクリック、接続イベント、またはdilaog.onshow()などのUIイベントで動作するいくつかのコールバックを定義します。デモの目的で、アクティビティコードから起動する必要がある実行可能なインターフェイスを選択しました。 Javaでは、自分自身を表現するさまざまな方法があります。

1つのパターンは、匿名クラスを使用することです

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}

別の - 内部プライベートクラスを定義するには、つまり

private DoSomething implements Runnable {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(new DoSomething());

さらに別の - このようなプライベートメンバーを使用する:

private final Runnable doSomething = new Runnable() {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(doSomething);

これが私が一番好きな別のものです。一方では、誰かが実際にそれを使用しない限り、実際にオブジェクトを構築しないため、必要に応じてパラメーターを取ることができるため、追加のクラスを避けているためです。

private Runnable doSomething() { 
    return new Runnable() {
        public void run() { 
            // do something; 
        }
    }
}
...
runOnUiThread(doSomething());

私は味や宗教的信念の議論ではなく、コードの保守性とパフォーマンスの議論を探しています。私は自分自身の好みを開発するのに役立つヒントとアドバイスを受けたいと思います - おそらく、与えられた状況に応じて異なる好みがあります。

ネタバレ:

Javaの進捗は、この質問を時代遅れにしました。受け入れられた答えを参照してください。

役に立ちましたか?

解決 5

今日、Java 8がAndroidとAndroid Studioでほぼ利用できるとき 自動的に ラムダがすでにサポートされているふりをして、匿名クラス(#1)ソリューションは明らかな選択のようです。

collapsed

expanded

他のヒント

コールバックを処理する慣用的な方法はないと思います。

私は通常、最初に匿名のクラスをインラインにします。メソッドが大きくなりすぎたら、クラスの作成を別の関数に抽出します。クラスが大きくなりすぎたら、独自のファイルに抽出します。

EclipseのようなIDEを使用している場合は、これらすべてのリファクタリングを自動的に安全に実行できます。

@Manuel Silvaや@Toby Championのように、私は匿名の内なるクラスが嫌いです。彼らは読むのがやや難しく、拡張できない、ディップ、セッターなどを調整することができないという点で非常に「OO」ではなく、動作などを調整するなど、しばしば乾燥した原則に違反することになります。同じコードを27の異なる場所に追加するとき。

私はプライベートメンバー(オプション#3)、または通常getasrunnable()という名前のプライベート機能(4番目のスタイル)を使用する傾向があります。

私はAndroidを初めて使用しましたが、匿名のクラスは私を吐き気を催させます。rononuithreadの質問

私の観点からは、匿名のクラスは読みやすさを本当に低下させます。 UIコードは非常に冗長であることが多いため、すべてのボタンに匿名のコールバックを追加すると、非常に大きなクラスにつながる可能性があります。結果として、私は内部プライベートクラスを使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top