我是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
数组的参数,而不是它的任何特定索引。我该怎么办。
很抱歉,如果我不清楚的话。
答案 0 :(得分:4)
实际上是一个有趣的问题:
为了更改获得的数组中的条目不会更改原始对象, 您将需要返回数组的副本。 不太好。
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);
}
}
这不会产生副本,但是简单地不允许在运行时更改列表。 这里的效率低下是因为Double对象包装了double。
最好的方法是使用新的Stream类:遍历双打:
public class TsEpicycle {
private double epoch;
private double[] tle = new double[10];
public DoubleStream getTLE() {
return Stream.of(tle);
}
}
答案 1 :(得分:1)
作为一般的最佳实践,您需要从另一个类访问的一个类中的每个字段都应提供一个 getter 和(如果该对象是可变的)一个 setter < / em>。
如 Joop Eggen 所解释的那样,通常是返回副本或代理(例如,引用数组的List / Collection)的一种好习惯,以保留其状态。原始数组。
答案 2 :(得分:0)
如果只允许用户一次编辑一个数组,则可以将synchronized
关键字添加到方法签名中。访问数组已经是线程安全的,因此您在那里不需要任何内容
例如:
double getTle(int index) {
return tle[index]
}
synchronized void setTle(int index, double value) {
tle[index] = value;
}
这仅允许一次调用该方法
答案 3 :(得分:0)
您的数组是java中其他任何对象的对象。
// to declare in initialize your array
private int[] st = new int[10];
//getter and setter
public int[] getSt() {
return st;
}
public void setSt(int[] st) {
this.st = st;
}
//for the last method u can use
public void method(int value)
{
for(int i = 0 ; i<st.lenght ; i++){
st[i] += value; // for exemple
}