接上篇:https://developer.aliyun.com/article/1228180?spm=a2c6h.13148508.setting.21.358c4f0eIHLsiZ
3. 利用其它方法实现
除此之外,还可以利用其它返回值方法实现参数的输入输出功能:
1) 利用数组实现
首先,在被调用方法中,定义一个对象数组,把多个返回值放入到对象数组中;最后,在调用函数中,把这些参数值从对象数组中取出来,并强制转化为对应的数据类型。
利用对象数组的问题是——代码可读性太差,而且在返回值的存入和取出过程中,需要进行数据类型的强制转化。如果所有返回值的数据类型一致,可以直接定义该类型的数组,从而避免了数据类型的强制转化。
2) 利用Map实现
首先,在被调用方法中,定义一个对象Map,把多个返回值放入到对象Map中;最后,在调用函数中,把这些参数值从对象Map中取出来,并强制转化为对应的数据类型。
利用对象Map实现,代码的可读性比利用对象数组实现更强,但是也存在同样的问题——在返回值的存入和取出过程中,需要进行数据类型的强制转化。如果所有返回值的类型一致,可以直接定义该类型的Map,从而避免了数据类型的强制转化。但是,利用对象Map实现,还不如定义一个返回值类更实用。
五 、 利用类字段实现
本章将从类字段入手,实现参数的输入输出功能。
1. 利用线程本地变量实现
理论依据:
线程本地变量(ThreadLocal):线程本地变量不同于它们的普通变量,因为访问某个变量的每个线程都有自己的局部变量,且独立于变量的初始化副本。线程本地变量实例通常是类中的私有静态字段,它希望将变量状态与某一个线程关联起来。要用类字段解决参数的输入输出问题,就必须考虑方法的线程安全性。这里,利用线程本地变量(ThreadLocal)来实现线程中输入输出参数值共享。
代码实现:
/**
* 几何辅助类
*/
public final class GeometryHelper {
/** 属性相关 */
/** 当前序号支撑 */
private static final ThreadLocal INDEX_HOLDER = new ThreadLocal<>();
/** 当前坐标支撑 */
private static final ThreadLocal COORDINATE_HOLDER = new ThreadLocal<>();
/** 原有静态常量 */
......
/**
* 划分线串
*
* @param lineString 原始线串
* @param segmentLengthes 分段长度数组
* @return 线串数组
*/
public static LineString[] splitLineString(LineString lineString, double[] segmentLengthes) {
// 原有计算逻辑
......
// 初始化参数值
INDEX_HOLDER.set(1);
Coordinate[] coordinates = lineString.getCoordinates();
COORDINATE_HOLDER.set(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_HOLDER.get(), COORDINATE_HOLDER.get());
// 清除支撑类
INDEX_HOLDER.remove();
COORDINATE_HOLDER.remove();
// 返回线串数组
return lineStrings;
}
/**
* 组装线串
*
* @param coordinates 坐标数组
* @param targetLength 目标长度
* @return 线串
*/
private static LineString combineLineString(Coordinate[] coordinates, long targetLength) {
// 获取支撑取值
int index = INDEX_HOLDER.get();
Coordinate coordinate = COORDINATE_HOLDER.get();
// 添加线串坐标
......
// 设置支持取值
INDEX_HOLDER.set(index);
COORDINATE_HOLDER.set(coordinate);
// 返回线串对象
return buildLineString(coordinateList);
}
/** 原有静态方法 */
......
}
接下篇:https://developer.aliyun.com/article/1228175?groupCode=java