1

我开始学习使用 Java 进行 Android 编程,主要来自在线 Android 文档。我还浏览了几本书,但它们似乎没有解决这个问题:Java 语法的一个特性,我曾多次遇到过,但对我来说这是一个谜。这只是联系人提供程序文档中的一个示例,位于

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

我想,这只是一种说法。让我感到困惑的是所有那些看起来好像属于 Visual Basic“with 子句”的“点运算符”。我在哪里可以找到这一切意味着什么?

4

3 回答 3

6

您正在查看构建器模式,其中每个 with* 方法的返回值是构建器本身(或对象,如果它不是一个构建器)。当您想要链接很多 setter 时,或者当底层对象有很多构造函数并且您不希望使用它的人感到困惑时,它们会很方便。或者,如下所述,当您希望返回的对象是不可变的(因此它不能有设置器)时。

更具体地说,对于您的情况, ContentProviderOperation.newInsert()的返回值是ContentProviderOperation.Builder,所有谁的方法都返回自己。通常这样的配置调用链将以调用build()结束,这将产生一个操作。

于 2013-01-14T17:13:53.310 回答
2

这是所谓的流畅接口的一个实例(链接到维基百科)。它有一个特别之处:从前一个调用返回的值被用作后续调用的目标。

像这样的 API 为具有大量可选参数的方法提供了一个有用的替代方案,因为生成的代码更容易阅读和理解。代码有点冗长,但在这种情况下这是一件好事,因为传递给构造函数的参数得到了更好的“标记”。当您有多个相同类型的参数(例如字符串)彼此相邻时,这种样式也更可取,因为它可以让读者避免参数计数。

于 2013-01-14T17:14:55.900 回答
0

这些方法中的每一个都返回一个ContentProviderOperation.Builder已被该方法修改的对象。因此,您可以将对此类方法的调用链接在一起,并以更紧凑的方式完成所有操作。它类似于 jQuery 在 javascript 世界中的工作方式。

查看 Android 文档中的newInsert 方法可能会更清楚一些,然后查看ContentProviderOperation.Builder类的文档。请注意,该对象上的所有方法也返回 ContentProviderOperation.Builder 对象。

于 2013-01-14T17:18:11.873 回答