なぜだめですか
AlertDialogBuilder builder = new AlertDialogBuilder(this);
builder.setTitle("foo");
それ以外の
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("foo");
更新: この種の書き込み/組織の背後にある理由を知りたい
なぜだめですか
AlertDialogBuilder builder = new AlertDialogBuilder(this);
builder.setTitle("foo");
それ以外の
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("foo");
更新: この種の書き込み/組織の背後にある理由を知りたい
Javadocsによると、ネストされたクラス(この場合は静的なネストされたクラス)は通常、次の3つの目的で使用されます。
ポイント3は、多くの開発者が静的にネストされたクラスを使用する理由の1つです。たとえば、Android開発のViewHolder
パターンを見てみましょう。では、 (または同様の名前の内部クラス)内ListAdapter
の各リスト要素のコンテンツを管理することにより、リストのキャッシュを簡単にすることができます。ViewHolder
この状況では、この特定ViewHolder
のクラスはこのクラス専用であり、これを変更しても、すべてを変更するわけではないことに気付くのは簡単です。これは、、、 ...、List1ViewHolder
。が必要ないことを意味します。各タイプの要素は、独自のを持つことができます。List2ViewHolder
ListNViewHolder
List
ViewHolder
ポイント#2は、静的内部クラスを扱っているため、このポイントとの関連性は少し低くなります(これがそうBuilder
です)。ただし、この場合、内部クラスの要素が外部クラスからアクセスされるのを防ぎます。
ポイント#1はここで大きなポイントです。そのため、最後に保存しました。を使用する状況を考えてくださいAlertDialog.Builder
。私は、100%確実に、使用するたびAlertDialog.Builder
に、の構築/作成/処理に含まれることを保証できますAlertDialog
。したがって、これは、のすべての使用がAlertDialog.Builder
どのように機能するかに関係していることを意味しAlertDialog
ます。(これはポイント#3とある程度関係があります。2つのクラスを分離するよりも、1つのファイルで2つのクラスを維持する方が簡単です。)
ポイント#1と#3に似ていますが、独自の儀式でもありますが、Builder
内にとどまることで、パッケージの名前空間AlertDialog
を汚染しないという事実があります。android.app
私たちはまだそのAlertDialog
中にとどまっています。しかし、そのBuilder
中に隠れています。
これを行うシステムはAndroidだけではありません。MotiveWave SDKもこれを行い、 AdobeAccessおよびeBaySDK (リンクがありません)も同様です。また、JavaEEもこの方法を使用していると思います。また、列挙型でもよく見られます。これは、ポイント1で説明した理由によるものです。
ここで、なぜAlertDialog.Builder
の代わりにを使用new AlertDialog()
し、ビルダーからではなくオブジェクトからビルドするのかを尋ねました。ここでの答えは、Javaやその他のオブジェクト指向プログラミング言語で一般的に見られるファクトリメソッドパターンと同じです。特に(ウィキペディアから)、これには3つの理由があります。
これらはそれ自体をかなりよく説明しています。彼らは、コードの重複(1つのクラス内ですべての作成機能を処理できる)、不正アクセス(不適切なカプセル化の慣行)、および構築の一貫した動作に反対しています。また、ここでリストされていないのは、コードの可読性です。
私AlertDialog
は、これは非常にリソースを大量に消費するプロセスだと思います。OSの一部を停止し、他の部分を実行し続け、システムリソースをロードする必要があります。この回答の詳細として、外部クラス(AlertDialog
この場合)への直接アクセスを提供したくありません。これにより、はBuilder
リソースを大量に消費するすべての操作を適切に処理できます。また、OS開発者が検討した難解な状況に対処する必要がなくなりますが、対処しませんでした。
したがって、結論として、これは実際にはまともな一般的なデザインパターンですが、実際に明示的に定義された意味を持つものではありません。むしろ、使いやすさ、理解、および保守性のためです。上記の設計上の考慮事項に関する懸念について言及しました。私はそれについてあまり心配しません。静的な内部クラスは常に外部クラスにのみ関連している必要があり、問題がないことを覚えておいてください。
Builderは、 AlertDialogクラス内の静的内部クラスです。したがって、Builderクラス オブジェクトを作成するには、 AlertDialog.Builderを呼び出す必要があります。
AlertDialogBuilderのようなクラスがないため、それを行うことはできません。
必要に応じて、次のように使用することもできます。
Builder builder = new Builder(this);
builder.setTitle("foo");
しかし、このように使用するには、次のようにBuilderクラスをクラスにインポートする必要があります
import android.app.AlertDialog.Builder;
ただの代わりに
import android.app.AlertDialog;
簡単な例
class A{
static class B{}
}
あなたは使用できません
AB obj = new AB();
使用する必要があります
A.B obj = new A.B();
あなたが今明確であることを願っています。
この種の組織の背後にいるあなたを一掃してみます。
まず、Builder は AlertDialog クラス内のクラスです。別のクラス内にクラスを作成するのはなぜですか? 個人的には、既存のクラスにさらに機能を追加する必要があり、設計の観点からクラスを拡張する必要があるとは思わない場合にのみ、ネストされたクラスを作成します。クラスに機能を追加するにはさまざまな方法があるため、これについては議論の余地があると思います。ただし、ネストされたクラスは他のクラスよりも優先される場合があります (一部の人にとっては)。
ネストされたクラスに関するオラクルの視点は次のとおりです。
入れ子になったクラスを使用するのは、それによってコードの保守性と直感性が向上する場合に限られます。
この場合、Google の担当者は、AlertDialog.Builder と比較して AlertDialogBuilder という新しいクラスを作成する代わりに、両方が同じ結果をもたらすためであることを発見したと思います。いくつかのボタンで画面にいくつかの情報を表示するダイアログ。両方の唯一の違い (私が思う) は、AlertDialog.Builder に正、中立、および負のボタンを設定できることです (これにより、クラスにより多くの機能が提供されますが、クラスを拡張する必要はありません。これもまた個人的な意見です)。
最終的に重要なことは、コードが機能し (できればバグがなければ)、保守可能で、読みやすく、直感的であるということです。このトピックについてはさまざまな意見があるため、あなたの質問に対する明確な答えはありません。
これが役立つことを願っています。
オブジェクトを構築するために使用されるアプローチAlertDialog
は、読みやすさを向上させるために Builder パターンと呼ばれます。新しいオブジェクトを構築したいが、このオブジェクトを作成するために多くのプロパティが必要な場合は、コンストラクターに渡すパラメーターが多すぎる (4 つ以上) など、混乱するでしょう。ビルダー パターンについて詳しく知りたい場合は、この回答でニーズを満たすことができると思います。AlertDialog の構築は、リンクの例と非常によく似ています。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("Do you really want to exit?")
.setCancelable(false)
.setNegativeButton("No",
new DaialogInterface.onClickListener() {
public void onClick(DialogInterface dialog,
int id) {
((AlertDialogActivity) getActivity())
.continueShutdown(false);
}
})
.setPositibeButton("Yes",
new DialogInterface.onClickListener()) {
public void onClick(
final DialogInterface dialog, int id) {
((AlertDialogActivity) getActivity())
.continueShutdown(true);
}
}).onCreate();
}
このメソッドは、アプリケーションを終了するかどうかをユーザーに尋ねる Dialog オブジェクトを返します。引数が多すぎるコンストラクターを呼び出して AlertDialog オブジェクトを作成しても意味がないことがわかります。AlertDialog
そのようなコンストラクターがあると想像してください:
AlertDialog ad = new AlertDialog(getActivity(), "Do you really want to exit?",
false, "No", .... )//and the list goes on
このアプローチをメソッドと比較すると、メソッドが正しいonCreateDialog
と思いますか?onCreateDialog