1

主にオンラインの Android ドキュメントから、Java を使用した Android プログラミングを学び始めています。私もいくつかの本を調べましたが、この問題に対処していないようです。私が何度か遭遇した Java 構文の機能であり、私には謎です。次の URL にある Contacts Provider のドキュメントの約半分からの一例を次に示します。

http://developer.android.com/guide/topics/providers/contacts-provider.html

コード スニペットを整理するためにコメントを削除しました。

op = 
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType);

これはすべて1つのステートメントだと思います。私を混乱させているのは、Visual Basic の "with 句" に属しているように見えるすべての "ドット演算子" です。これが何を意味するのか、どこで確認できますか?

4

3 に答える 3

6

ビルダーパターンを見ています。このような各 with* メソッドの戻り値は、ビルダー自体 (または、正確にビルダーでない場合はオブジェクト) です。多くのセッターを連鎖させたい場合、または基礎となるオブジェクトのコンストラクターが多数あり、それを使用する人々を混乱させたくない場合に便利です。または、以下に示す fge のように、返されたオブジェクトを不変にしたい場合 (したがって、セッターを持つことはできません)。

より具体的には、ContentProviderOperation.newInsert()の戻り値はContentProviderOperation.Builderであり、誰のメソッドもすべてそれ自体を返します。通常、このような一連の構成呼び出しは、操作を生成するbuild()の呼び出しで終了します。

于 2013-01-14T17:13:53.310 に答える
2

これは、いわゆる流暢なインターフェースの例です(ウィキペディアへのリンク)。これには特別な注意点があります。前の呼び出しから返された値が、後続の呼び出しのターゲットとして使用されています。

このような API は、結果として得られるコードが読みやすく理解しやすいため、多くのオプションのパラメーターを持つメソッドに代わる便利な方法を提供します。コードはやや冗長ですが、コンストラクターに渡されるパラメーターの "タグ付け" が改善されるため、この場合は良いことです。このスタイルは、同じタイプ (文字列など) の複数のパラメーターが隣り合っている場合にも適しています。これにより、リーダーはパラメーターのカウントを回避できます。

于 2013-01-14T17:14:55.900 に答える
0

ContentProviderOperation.Builderこれらの各メソッドは、メソッドによって変更されたオブジェクトを返します。そのため、そのようなメソッドへの呼び出しを連鎖させて、すべてをよりコンパクトな方法で行うことができます。これは、JavaScript の世界で jQuery がどのように機能するかに似ています。

Android ドキュメンテーションのnewInsert メソッドを調べてから、 ContentProviderOperation.Builderクラスのドキュメンテーションを調べると、少しクリアになるかもしれません。そのオブジェクトのすべてのメソッドも ContentProviderOperation.Builder オブジェクトを返すことに注意してください。

于 2013-01-14T17:18:11.873 に答える