博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fluent interface
阅读量:5893 次
发布时间:2019-06-19

本文共 3499 字,大约阅读时间需要 11 分钟。

In , a fluent interface (as first coined by  and ) is an implementation of an  API that aims to provide for more readable code.

A fluent interface is normally implemented by using  (concretely ) to relay the instruction context of a subsequent call (but a fluent interface entails more than just method chaining ). Generally, the context is

  • defined through the return value of a called method
  • self-referential, where the new context is equivalent to the last context
  • terminated through the return of a void context.

 

History[]

The term "fluent interface" was coined in late 2005, though this overall style of interface dates to the invention of method cascading in Smalltalk in the 1970s, and numerous examples in the 1980s. The most familiar is the  library in C++, which uses the << or >> for the message passing, sending multiple data to the same object and allowing "manipulators" for other method calls. Other early examples include the  (from 1988 in Lisp) and the  (from 1994 in C++) which used this style for object creation and property assignment.

 

Examples[]

Java[]

The  library models SQL as a fluent API in Java

1
2
3
4
5
6
Author a = AUTHOR.as(
"a"
);
create.selectFrom(a)
      
.where(exists(selectOne()
                   
.from(BOOK)
                   
.where(BOOK.STATUS.eq(BOOK_STATUS.SOLD_OUT))
                   
.and(BOOK.AUTHOR_ID.eq(a.ID))));

  

The  library enables the use of fluent code for performing auxiliary tasks like structure iteration, data conversion, filtering, etc.

1
2
3
4
String[] datesStr = 
new 
String[] {
"12-10-1492"
"06-12-1978"
};
...
List<Calendar> dates =
    
Op.on(datesStr).toList().map(FnString.toCalendar(
"dd-MM-yyyy"
)).get();

  

The  annotation processor enables the creation of a fluent API using Java annotations.

Also, the  testing library  makes extensive use of this style of interface to provide an expressive programming interface.

1
2
Collection mockCollection = EasyMock.createMock(Collection.
class
);
EasyMock.expect(mockCollection.remove(
null
)).andThrow(
new 
NullPointerException()).atLeastOnce();

  

In the Java Swing API, the LayoutManager interface defines how Container objects can have controlled Component placement. One of the more powerful LayoutManager implementations is the GridBagLayout class which requires the use of the GridBagConstraints class to specify how layout control occurs. A typical example of the use of this class is something like the following.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GridBagLayout gl = 
new 
GridBagLayout();
JPanel p = 
new 
JPanel();
p.setLayout( gl );
  
JLabel l = 
new 
JLabel(
"Name:"
);
JTextField nm = 
new 
JTextField(
10
);
  
GridBagConstraints gc = 
new 
GridBagConstraints();
gc.gridx = 
0
;
gc.gridy = 
0
;
gc.fill = GridBagConstraints.NONE;
p.add( l, gc );
  
gc.gridx = 
1
;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 
1
;
p.add( nm, gc );

  

This creates a lot of code and makes it difficult to see what exactly is happening here. The Packer class, visible at , provides a Fluent mechanism for using this class so that you would instead write:

1
2
3
4
5
6
7
8
JPanel p = 
new 
JPanel();
Packer pk = 
new 
Packer( p );
  
JLabel l = 
new 
JLabel(
"Name:"
);
JTextField nm = 
new 
JTextField(
10
);
  
pk.pack( l ).gridx(
0
).gridy(
0
);
pk.pack( nm ).gridx(
1
).gridy(
0
).fillx();

  

There are many places where Fluent APIs can greatly simplify how software is written and help create an API language that helps users be much more productive and comfortable with the API because the return value of a method always provides a context for further actions in that context.

转载地址:http://zsssx.baihongyu.com/

你可能感兴趣的文章
正则表达式匹配非需要匹配的字符串(标题自己都绕晕了)
查看>>
沙盒目录介绍
查看>>
260. Single Number III
查看>>
c#基础--字符串的处理_string类
查看>>
《C语言》-(流程控制:顺序结构、选择结构、循环结构)
查看>>
mobile deeplearning
查看>>
Hadoop生态圈-Kafka的完全分布式部署
查看>>
《玩转Django2.0》读书笔记-探究视图
查看>>
SOCK_STREAM & SOCK_DGRAM
查看>>
css的border的solid
查看>>
div+css实现window xp桌面图标布局(至上而下从左往右)
查看>>
0-1 背包问题
查看>>
运行Maven是报错:No goals have been specified for this build
查看>>
Haskell 差点儿无痛苦上手指南
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
NTP 服务器配置
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
linux在文件打包和压缩
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>