接上篇:https://developer.aliyun.com/article/1228182?spm=a2c6h.13148508.setting.19.358c4f0eIHLsiZ
4. 利用支撑类实现
理论依据:
在上一节里,把所有输入输出参数放入到一个元组里,每一个输入输出参数没有一个具体的命名,造成了代码的理解和维护困难。如果每一个输入输出参数都定义一个元组,可以让代码维护者轻松地知道每一个参数的具体含义。所以,这里定义了自己的一元元组类——ObjectHolder(对象支撑类,也可以使用javatuples的Unit类),用于传递输入输出参数值。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
Coordinate[] coordinates = lineString.getCoordinates();
ObjectHolder indexHolder = new ObjectHolder<>(1);
ObjectHolder coordinateHolder = new ObjectHolder<>(coordinates[0]);
int length = targetLengthes.length;
LineString[] lineStrings = new LineString[length];
// 添加前面N段
for (int i = 0; i < length - 1; i++) {
lineStrings[i] = combineLineString(coordinates, indexHolder, coordinateHolder, targetLengthes[i]);
}
// 添加最后一段
lineStrings[length - 1] = buildLineString(coordinates, indexHolder.getValue(), coordinateHolder.getValue());
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param indexHolder 序号支撑
* @param coordinateHolder 坐标支撑
* @param targetLength 目标长度
* @return 线串
*/
private static LineString combineLineString(Coordinate[] coordinates, ObjectHolder indexHolder, ObjectHolder coordinateHolder, long targetLength) {
// 获取支撑取值
int index = indexHolder.getValue();
Coordinate coordinate = coordinateHolder.getValue();
// 添加线串坐标
......
// 设置支撑取值
indexHolder.setValue(index);
coordinateHolder.setValue(coordinate);
// 返回线串对象
return buildLineString(coordinateList);
}
/** 原有静态方法 */
......
}
/**
* 对象支撑类
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ObjectHolder {
/** 对象取值 */
private T value;
}
2. 利用其它方法实现
除此之外,还可以利用其它参数方法实现参数的输入输出功能:
1) 利用数组实现
首先,在调用函数中,定义一个对象数组,把所有输入输出参数存入对象数组中;其次,在被调用函数中,把这些参数从对象数组中取出来使用;再次,在被调用函数中,再把这些参数值存入对象数组中;最后,在调用函数中,把这些参数值从对象数组中取出来使用。
利用对象数组的问题是——代码可读性太差,而且在参数的存入和取出过程中,需要进行数据类型的强制转化。如果所有输入输出参数的类型一致,可以直接定义该类型的数组,从而避免了数据类型的强制转化。
2) 利用Map实现
首先,在调用函数中,定义一个对象Map,把所有输入输出参数存入对象Map中;其次,在被调用函数中,把这些参数从对象Map中取出来使用;再次,在被调用函数中,再把这些参数值存入对象Map中;最后,在调用函数中,把这些参数值从对象Map中取出来使用。
利用对象Map实现,代码的可读性比利用对象数组实现更强,但是也存在同样的问题——在参数的存入和取出过程中,需要进行数据类型的强制转化。如果所有输入输出参数的类型一致,可以直接定义该类型的Map,从而避免了数据类型的强制转化。但是,利用对象Map实现,还不如定义一个参数类更实用。
3) 利用原子类实现
JDK中,提供了一套原子类——AtomicInteger、AtomicLong、AtomicDouble等,可用于对应的基础类型和包装类型,实现对应参数的输入输出功能。实现方法跟ObjectHolder一样,这里不再累述。
接下篇:https://developer.aliyun.com/article/1228180?groupCode=java