我开始学习使用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 clause”的“点运算符”。我在哪里可以找到这一切意味着什么?
答案 0 :(得分:6)
你正在看builder pattern,其中每个这样的*方法的返回值是构建器本身(或者对象,如果它不是构建器)。当你想链接很多setter时,或者当底层对象有很多构造函数而你不想让人们使用它时会感到困惑。或者,如下所示,当你希望返回的对象是不可变的时(因此它不能有setter)。
更具体地说,对于您的情况,ContentProviderOperation.newInsert()的返回值是ContentProviderOperation.Builder,所有人的方法都会返回。通常这样的配置调用链将以build()的调用结束,这将产生一个操作。
答案 1 :(得分:2)
这是所谓的流畅接口(link to wikipedia)的一个实例。关于它的特别之处:从前一次调用返回的值被用作后续调用的目标。
像这样的API提供了一个有用的替代方法,可以替代具有大量可选参数的方法,因为生成的代码更容易阅读和理解。代码有点冗长,但在这种情况下它是一件好事,因为传递给构造函数的参数得到了更好的“标记”。当您有多个相同类型(例如,字符串)的参数彼此相邻时,这种样式也更可取,因为它可以让读者避免参数计数。答案 2 :(得分:0)
这些方法中的每一个都返回已由方法修改的ContentProviderOperation.Builder
对象。因此,您可以将调用链接到这样的方法,并以更紧凑的方式执行所有操作。它类似于jQuery在javascript世界中的工作方式。
要查看Android文档中的newInsert method,可能会稍微清楚一点,然后查看ContentProviderOperation.Builder类的文档。请注意,该对象上的所有方法也返回ContentProviderOperation.Builder对象。