接上篇:https://developer.aliyun.com/article/1228181?spm=a2c6h.13148508.setting.20.358c4f0eIHLsiZ
四、 利用方法返回值实现
本章将从方法返回值入手,实现参数的输入输出功能。
1. 利用结果类实现
理论依据:
引入返回值对象(Introduce Return Object):当一个方法的需要返回多个值时,就可以考虑将返回值封装成一个对象类。将返回值封装成对象类后,提高了代码的可读性,并且该返回值对象类也可以重用。以后,如果增加或删除返回值,方法本身不需要修改,只需要修改返回值对象类就可以了。
这里,可以利用引入返回值对象重构方法,定义一个返回值对象类,来实现参数的输入输出功能。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
int index = 1;
Coordinate[] coordinates = lineString.getCoordinates();
Coordinate coordinate = coordinates[0];
int length = targetLengthes.length;
LineString[] lineStrings = new LineString[length];
// 添加前面N段
for (int i = 0; i < length - 1; i++) {
ReturnResult result = combineLineString(coordinates, index, coordinate, targetLengthes[i]);
index = result.getIndex();
coordinate = result.getCoordinate();
lineStrings[i] = result.getLineString();
}
// 添加最后一段
lineStrings[length - 1] = buildLineString(coordinates, index, coordinate);
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param index 当前序号
* @param coordinate 当前坐标
* @param targetLength 目标长度
* @return 返回值
*/
private static ReturnResult combineLineString(Coordinate[] coordinates, int index, Coordinate coordinate, long targetLength) {
// 添加线串坐标
......
// 返回输出结果
return new ReturnResult(index, coordinate, buildLineString(coordinateList));
}
/** 原有静态方法 */
......
/**
* 返回值类
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
private static class ReturnResult {
/** 当前序号 */
private int index;
/** 当前坐标 */
private Coordinate coordinate;
/** 线串对象 */
private LineString lineString;
}
}
2. 利用元组类实现
理论依据:
参考3.3章节的元组(Tuple)的定义和特性。元组(Tuple)可以用于方法的参数值,也可以用于方法的返回值。当一个方法需要返回多个值时,又不愿意定义自己的结果类时,可以采用元组(Tuple)实现多个值的返回。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
int index = 1;
Coordinate[] coordinates = lineString.getCoordinates();
Coordinate coordinate = coordinates[0];
int length = targetLengthes.length;
LineString[] lineStrings = new LineString[length];
// 添加前面N段
for (int i = 0; i < length - 1; i++) {
Triple triple = combineLineString(coordinates, index, coordinate, targetLengthes[i]);
index = triple.getLeft();
coordinate = triple.getMiddle();
lineStrings[i] = triple.getRight();
}
// 添加最后一段
lineStrings[length - 1] = buildLineString(coordinates, index, coordinate);
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param index 当前序号
* @param coordinate 当前坐标
* @param targetLength 目标长度
* @return 返回值
*/
private static Triple combineLineString(Coordinate[] coordinates, int index, Coordinate coordinate, long targetLength) {
// 添加线串坐标
......
// 返回输出结果
return ImmutableTriple.of(index, coordinate, buildLineString(coordinateList));
}
/** 原有静态方法 */
......
}
接下篇:https://developer.aliyun.com/article/1228177?groupCode=java