接上篇:https://developer.aliyun.com/article/1228185?spm=a2c6h.13148508.setting.17.358c4f0eIHLsiZ
三、 利用方法参数实现
本章将从方法参数入手,实现参数的输入输出功能。
1. 利用参数类实现
理论依据:
引入参数对象(Introduce Parameter Object):当一个方法的参数超过3个时,就可以考虑将参数封装成一个对象类。将参数封装成对象类后,提高了代码的可读性,并且该参数对象类也可以重用。以后,如果增加或删除参数,方法本身不需要修改,只需要修改参数对象类就可以了。
这里,可以利用引入参数对象重构方法,定义一个输入输出参数类,来实现参数的输入输出功能。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
Coordinate[] coordinates = lineString.getCoordinates();
InoutParameter inoutParameter = new InoutParameter(1, coordinates[0]);
int length = targetLengthes.length;
LineString[] lineStrings = new LineString[length];
// 添加前面N段
for (int i = 0; i < length - 1; i++) {
lineStrings[i] = combineLineString(coordinates, inoutParameter, targetLengthes[i]);
}
// 添加最后一段
lineStrings[length - 1] = buildLineString(coordinates, inoutParameter.getIndex(), inoutParameter.getCoordinate());
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param inoutParameter 输入输出参数
* @param targetLength 目标长度
* @return 线串
*/
private static LineString combineLineString(Coordinate[] coordinates, InoutParameter inoutParameter, long targetLength) {
// 获取输入参数
int index = inoutParameter.getIndex();
Coordinate coordinate = inoutParameter.getCoordinate();
// 添加线串坐标
......
// 设置输出参数
inoutParameter.setIndex(index);
inoutParameter.setCoordinate(coordinate);
// 返回线串对象
return buildLineString(coordinateList);
}
/** 原有静态方法 */
......
/**
* 输入输出参数类
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
private static class InoutParameter {
/** 当前序号 */
private int index;
/** 当前坐标 */
private Coordinate coordinate;
}
}
2. 利用单值数组实现
理论依据:
当您将对象引用传递到方法中时,您将得到该对象引用的副本。也就是说,当您将数组引用传递到方法中时,您将得到该数组引用的副本。但是,这两个数组引用都指向同一个数组,当修改副本数组引用中的值时,也能体现到原有数组引用中。
利用数组引用的这个特性,可以实现参数的输入输出功能。这里,引入了单值数组的概念,即一个数组只有一个值,用于传递输入输出参数值。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
int[] indexHolder = new int[] {1};
Coordinate[] coordinates = lineString.getCoordinates();
Coordinate[] coordinateHolder = new Coordinate[] {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[0], coordinateHolder[0]);
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param indexHolder 序号支撑
* @param coordinateHolder 坐标支撑
* @param targetLength 目标长度
* @return 线串
*/
private static LineString combineLineString(Coordinate[] coordinates, int[] indexHolder, Coordinate[] coordinateHolder, long targetLength) {
// 获取支撑取值
int index = indexHolder[0];
Coordinate coordinate = coordinateHolder[0];
// 添加线串坐标
......
// 设置支撑取值
indexHolder[0] = index;
coordinateHolder[0] = coordinate;
// 返回线串对象
return buildLineString(coordinateList);
}
/** 原有静态方法 */
......
}
接下篇:https://developer.aliyun.com/article/1228182?groupCode=java