我是Java新手,我需要一些关于如何处理问题的说明。
我有一个类Epicycle,定义如下:
public class Ts_epicycle {
private double epoch;
private double[] tle = new double[10];
}在另一个类Refine中,我调用了一个需要tle数组的方法:
// create an instance of Epicycle
Epicycle e = new Epicycle();
methodExample(keps1, keps2, e.tle);在methodExample中,我将为tle设置数组值
1)为tle数组创建getter/setter的最佳方式是什么?(对于其他变量也是如此)。
2)在methodExample中,我需要传入整个tle数组的参数,而不是它的任何特定索引。我该怎么做呢。
如果我说得不够清楚,很抱歉。
发布于 2018-07-19 23:55:17
事实上,有一个有趣的问题:
为了使更改获取的数组中的条目不会更改原始对象,您需要返回该数组的副本。不是很好。
public class TsEpicycle {
private double epoch;
private double[] tle = new double[10];
public double[] getTLE() {
return Arrays.copyOf(tle, tle.length);
}
}或者,您可以使用List类而不是数组:
public class TsEpicycle {
private double epoch;
private List<Double> tle = new ArrayList<>();
public List<Double> getTLE() {
return Collections.unmodifiableList(tle);
}
}这不会创建副本,但simple不允许在运行时更改列表。在这里,效率低下的是双重对象包装Double。
最好的方法可能是使用新的Stream类:用于迭代doubles:
public class TsEpicycle {
private double epoch;
private double[] tle = new double[10];
public DoubleStream getTLE() {
return Stream.of(tle);
}
}发布于 2018-07-20 00:19:37
作为一般的最佳实践,您需要从另一个类访问的类中的每个字段都应该提供一个getter和一个setter (如果对象是可变的)。
正如Joop Eggen在他的回答中所解释的那样,通常是返回副本或代理(例如引用数组的列表/集合)的良好实践,以便保留原始数组的状态。
发布于 2018-07-19 23:47:48
如果只想让用户一次只编辑一个数组,那么可以将synchronized关键字添加到方法签名中。访问一个数组已经是线程安全的,所以你不需要任何东西
例如:
double getTle(int index) {
return tle[index]
}
synchronized void setTle(int index, double value) {
tle[index] = value;
}这只允许该方法一次调用一次
https://stackoverflow.com/questions/51426788
复制相似问题