接上篇:https://developer.aliyun.com/article/1228177?spm=a2c6h.13148508.setting.22.358c4f0eIHLsiZ
2. 利用类成员变量实现
理论依据:
在上一章节中,利用线程本地变量(ThreadLocal)来实现线程中输入输出参数值共享,让方法的封装更复杂——需要从线程本地变量(ThreadLocal)读取和存储输入输出参数值。有没有一种更简单的方法,直接利用类成员变量实现输入输出参数值的共享呢?
答案是肯定的,可以把方法的封装和变量的定义封装到一个类中。这样,在每一个类实例中,都可以利用类成员变量来实现输入输出参数值的共享。但是,这个类是线程非安全的,必须在单线程中使用。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
// 原有构造方法
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
SplitLineStringAlgorithm algorithm = new SplitLineStringAlgorithm();
return algorithm.splitLineString(lineString, segmentLengthes);
}
}
/**
* 划分线串算法类
*/
public class SplitLineStringAlgorithm {
/** 属性相关 */
/** 当前序号 */
private int index;
/** 当前坐标 */
private Coordinate coordinate;
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
index = 1;
Coordinate[] coordinates = lineString.getCoordinates();
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, targetLengthes[i]);
}
// 添加最后一段
lineStrings[length - 1] = buildLineString(coordinates, index, coordinate);
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param targetLength 目标长度
* @return 线串
*/
private LineString combineLineString(Coordinate[] coordinates, long targetLength) {
// 添加线串坐标
......
// 返回线串对象
return buildLineString(coordinateList);
}
/** 原有静态方法 */
......
}
接下篇:https://developer.aliyun.com/article/1228172?groupCode=java