12

なぜだめですか

AlertDialogBuilder builder = new  AlertDialogBuilder(this);
builder.setTitle("foo");

それ以外の

AlertDialog.Builder builder = new  AlertDialog.Builder(this);
builder.setTitle("foo");

更新: この種の書き込み/組織の背後にある理由を知りたい

4

4 に答える 4

25

Javadocsによると、ネストされたクラス(この場合は静的なネストされたクラス)は通常、次の3つの目的で使用されます。

  1. 一緒にのみ使用されるクラスを論理的にグループ化します。
  2. カプセル化の増加。
  3. コードの可読性と保守性の向上。

ポイント3は、多くの開発者が静的にネストされたクラスを使用する理由の1つです。たとえば、Android開発のViewHolderパターンを見てみましょう。では、 (または同様の名前の内部クラス)内ListAdapterの各リスト要素のコンテンツを管理することにより、リストのキャッシュを簡単にすることができます。ViewHolderこの状況では、この特定ViewHolderのクラスはこのクラス専用であり、これを変更しても、すべてを変更するわけではないことに気付くのは簡単です。これは、、、 ...、List1ViewHolder。が必要ないことを意味します。各タイプの要素は、独自のを持つことができます。List2ViewHolderListNViewHolderListViewHolder

ポイント#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. オブジェクトを作成すると、コードを大幅に複製することなくオブジェクトを再利用できなくなります。
  2. オブジェクトの作成には、作成クラスに含まれてはならない情報またはリソースへのアクセスが必要です。
  3. 生成されたオブジェクトのライフタイム管理は、アプリケーション内で一貫した動作を保証するために一元化する必要があります。

これらはそれ自体をかなりよく説明しています。彼らは、コードの重複(1つのクラス内ですべての作成機能を処理できる)、不正アクセス(不適切なカプセル化の慣行)、および構築の一貫した動作に反対しています。また、ここでリストされていないのは、コードの可読性です。

AlertDialogは、これは非常にリソースを大量に消費するプロセスだと思います。OSの一部を停止し、他の部分を実行し続け、システムリソースをロードする必要があります。この回答の詳細として、外部クラス(AlertDialogこの場合)への直接アクセスを提供したくありません。これにより、はBuilderリソースを大量に消費するすべての操作を適切に処理できます。また、OS開発者が検討した難解な状況に対処する必要がなくなりますが、対処しませんでした。

したがって、結論として、これは実際にはまともな一般的なデザインパターンですが、実際に明示的に定義された意味を持つものではありません。むしろ、使いやすさ、理解、および保守性のためです。上記の設計上の考慮事項に関する懸念について言及しました。私はそれについてあまり心配しません。静的な内部クラスは常に外部クラスにのみ関連している必要があり、問題がないことを覚えておいてください。

于 2012-08-10T05:54:15.300 に答える
13

Builderは、 AlertDialogクラス内の静的内部クラスです。したがって、Builderクラス オブジェクトを作成するには、 AlertDialog.Builderを呼び出す必要があります。

AlertDialogBu​​ilderのようなクラスがないため、それを行うことはできません。

必要に応じて、次のように使用することもできます。

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

あなたが今明確であることを願っています。

于 2012-08-04T16:57:15.283 に答える
1

この種の組織の背後にいるあなたを一掃してみます。

まず、Builder は AlertDialog クラス内のクラスです。別のクラス内にクラスを作成するのはなぜですか? 個人的には、既存のクラスにさらに機能を追加する必要があり、設計の観点からクラスを拡張する必要があるとは思わない場合にのみ、ネストされたクラスを作成します。クラスに機能を追加するにはさまざまな方法があるため、これについては議論の余地があると思います。ただし、ネストされたクラスは他のクラスよりも優先される場合があります (一部の人にとっては)。

ネストされたクラスに関するオラクルの視点は次のとおりです。

入れ子になったクラスを使用するのは、それによってコードの保守性と直感性が向上する場合に限られます。

この場合、Google の担当者は、AlertDialog.Builder と比較して AlertDialogBu​​ilder という新しいクラスを作成する代わりに、両方が同じ結果をもたらすためであることを発見したと思います。いくつかのボタンで画面にいくつかの情報を表示するダイアログ。両方の唯一の違い (私が思う) は、AlertDialog.Builder に正、中立、および負のボタンを設定できることです (これにより、クラスにより多くの機能が提供されますが、クラスを拡張する必要はありません。これもまた個人的な意見です)。

最終的に重要なことは、コードが機能し (できればバグがなければ)、保守可能で、読みやすく、直感的であるということです。このトピックについてはさまざまな意見があるため、あなたの質問に対する明確な答えはありません。

これが役立つことを願っています。

于 2012-08-15T19:37:50.870 に答える
0

オブジェクトを構築するために使用されるアプローチ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

于 2014-10-27T16:30:32.613 に答える