参数|Java编程技巧:如何实现参数的输入输出?( 二 )


元组(Tuple):Java中的元组(Tuple)是一种数据结构,可以存放多个元素,并且每个元素的数据类型可以不同。Tuple与List类似,但是不同的是,List只能存储一种数据类型,而Tuple可存储多种数据类型。
可能你会质疑,Object类型的List实际也是可以存储多种类型的啊?但是,在创建List时,需要指定元素数据类型,只能指定为Object类型;在获取的元素时,只能获取到Object类型的值,需要强制转化为对应的数据类型。而Tuple在创建时,可以直接指定多个元素数据类型;在获取元素时,无需进行数据类型的强制转化。
常用的元组工具包有:
Apache的commons-lang3提供的元组类:
Pair:MutablePair,ImmutablePair
Triple:MutableTriple、ImmutableTriple
JavaTuples提供的元组类:
Unit
Pair,KeyValue
Triplet
Quartet
Quintet
Sextet
Septet
Octet
Ennead
Decade
随着元组的元数不断地增加,代码的阅读性也逐渐地下降。当元组的元数超过3个时,不如直接创建对象类,并给予合适类名和字段名,便于代码的理解和维护。所以,不建议使用JavaTuples中的元组类,而推荐使用Apache的commons-lang3提供的元组类。
代码实现:
3.4 利用支撑类实现
理论依据:
在上一节里,把所有输入输出参数放入到一个元组里,每一个输入输出参数没有一个具体的命名,造成了代码的理解和维护困难。如果每一个输入输出参数都定义一个元组,可以让代码维护者轻松地知道每一个参数的具体含义。所以,这里定义了自己的一元元组类——ObjectHolder(对象支撑类,也可以使用javatuples的Unit类),用于传递输入输出参数值。
代码实现:
3.5 利用其它方法实现
除此之外,还可以利用其它参数方法实现参数的输入输出功能:
利用数组实现
首先,在调用函数中,定义一个对象数组,把所有输入输出参数存入对象数组中;其次,在被调用函数中,把这些参数从对象数组中取出来使用;再次,在被调用函数中,再把这些参数值存入对象数组中;最后,在调用函数中,把这些参数值从对象数组中取出来使用。
利用对象数组的问题是——代码可读性太差,而且在参数的存入和取出过程中,需要进行数据类型的强制转化。如果所有输入输出参数的类型一致,可以直接定义该类型的数组,从而避免了数据类型的强制转化。
利用Map实现
首先,在调用函数中,定义一个对象Map,把所有输入输出参数存入对象Map中;其次,在被调用函数中,把这些参数从对象Map中取出来使用;再次,在被调用函数中,再把这些参数值存入对象Map中;最后,在调用函数中,把这些参数值从对象Map中取出来使用。
利用对象Map实现,代码的可读性比利用对象数组实现更强,但是也存在同样的问题——在参数的存入和取出过程中,需要进行数据类型的强制转化。如果所有输入输出参数的类型一致,可以直接定义该类型的Map,从而避免了数据类型的强制转化。但是,利用对象Map实现,还不如定义一个参数类更实用。
利用原子类实现
JDK中,提供了一套原子类——AtomicInteger、AtomicLong、AtomicDouble等,可用于对应的基础类型和包装类型,实现对应参数的输入输出功能。实现方法跟ObjectHolder一样,这里不再累述。
四 利用方法返回值实现
本章将从方法返回值入手,实现参数的输入输出功能。
4.1 利用结果类实现
理论依据:
引入返回值对象(Introduce Return Object):当一个方法的需要返回多个值时,就可以考虑将返回值封装成一个对象类。将返回值封装成对象类后,提高了代码的可读性,并且该返回值对象类也可以重用。以后,如果增加或删除返回值,方法本身不需要修改,只需要修改返回值对象类就可以了。
这里,可以利用引入返回值对象重构方法,定义一个返回值对象类,来实现参数的输入输出功能。
代码实现:
4.2 利用元组类实现
理论依据:
参考3.3章节的元组(Tuple)的定义和特性。元组(Tuple)可以用于方法的参数值,也可以用于方法的返回值。当一个方法需要返回多个值时,又不愿意定义自己的结果类时,可以采用元组(Tuple)实现多个值的返回。
代码实现:
4.3 利用其它方法实现
除此之外,还可以利用其它返回值方法实现参数的输入输出功能:
利用数组实现
首先,在被调用方法中,定义一个对象数组,把多个返回值放入到对象数组中;最后,在调用函数中,把这些参数值从对象数组中取出来,并强制转化为对应的数据类型。
利用对象数组的问题是——代码可读性太差,而且在返回值的存入和取出过程中,需要进行数据类型的强制转化。如果所有返回值的数据类型一致,可以直接定义该类型的数组,从而避免了数据类型的强制转化。
利用Map实现
首先,在被调用方法中,定义一个对象Map,把多个返回值放入到对象Map中;最后,在调用函数中,把这些参数值从对象Map中取出来,并强制转化为对应的数据类型。
利用对象Map实现,代码的可读性比利用对象数组实现更强,但是也存在同样的问题——在返回值的存入和取出过程中,需要进行数据类型的强制转化。如果所有返回值的类型一致,可以直接定义该类型的Map,从而避免了数据类型的强制转化。但是,利用对象Map实现,还不如定义一个返回值类更实用。


推荐阅读