Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否在使用方法、构造函数和;getters对吗?_Java_Constructor_Getter - Fatal编程技术网

Java 我是否在使用方法、构造函数和;getters对吗?

Java 我是否在使用方法、构造函数和;getters对吗?,java,constructor,getter,Java,Constructor,Getter,我有一个计算ArrayList平均值的类,我想知道是否正确设置了它?我对Java还是一个新手,所以我想要结束的只是将ArrayList作为一个参数,并使用以下命令在main方法中返回它: StatCalc stats = new StatCalc(someArrayList); System.out.printf("Mean of someArrayList is: %.3f\n", stats.getAverage()); 这是StatCalc类 public class StatCalc

我有一个计算ArrayList平均值的类,我想知道是否正确设置了它?我对Java还是一个新手,所以我想要结束的只是将ArrayList作为一个参数,并使用以下命令在main方法中返回它:

StatCalc stats = new StatCalc(someArrayList);
System.out.printf("Mean of someArrayList is: %.3f\n", stats.getAverage());
这是StatCalc类

public class StatCalc {
    //declare inst variables & method
    private double average = 0;
    private double meanCalc(ArrayList<Double> myList) {
        double sum = 0;
        if (!myList.isEmpty()) {
            for (Double element : myList) {
                sum += element;
            }
        }
        return sum / myList.size();
    }
    //Constructor
    public StatCalc(ArrayList<Double> myList) {
        double average = meanCalc(myList);
        this.average = average;

    }

    //getter
    public double getAverage() {
         return average;
    }
}
公共类StatCalc{
//声明inst变量和方法
私人双平均=0;
私有双平均值(ArrayList myList){
双和=0;
如果(!myList.isEmpty()){
for(双元素:myList){
总和+=元素;
}
}
返回和/myList.size();
}
//建造师
公共StatCalc(ArrayList myList){
双平均值=平均值(myList);
这个平均数=平均数;
}
//吸气剂
公共双平均值(){
收益率平均值;
}
}

我只是想知道,这是Java中“应该”做的事情,就像以前我在构造函数中使用meanCalc方法一样,但我认为这是一个糟糕的做法?

在你的构造函数中,你将
average
声明为构造函数范围

只需从以下内容中删除
double
double average=meanCalc(myList)

这将分配实例字段,而不是构造函数中具有相同名称的变量

反过来,
getAverage()
方法将在赋值后返回实例字段
average
,而不是其默认值unassigned,即
0.0

简言之:

//Constructor
public StatCalc(ArrayList<Double> myList) {
    average = meanCalc(myList);
}
//构造函数
公共StatCalc(ArrayList myList){
平均值=平均值(myList);
}
最后一个音符

如果您提供的功能仅取决于给定的参数,那么您可能不需要创建类的实例


您可以使用一个静态方法返回
double
,并将
列表作为参数

仅供参考,在java 8+下,所有代码只能替换为一行:

List<Double> list = new ArrayList<>();
    [...]
OptionalDouble average = list.stream().mapToDouble(Double::doubleValue).average();
List List=new ArrayList();
[...]
OptionalDouble average=list.stream().mapToDouble(Double::doubleValue.average();

这看起来没问题-除了构造函数中发生的事情可能不是您想要的。您应该创建一个
setter
函数来设置平均值。当前,
average
字段上未设置
average
,因为您正在将其分配给本地
双精度
。这取决于您希望如何使用该类。但是看起来您应该创建一个静态方法来接受一个列表并从中计算平均值,而不是每次希望获取列表的平均值时都创建一个对象实例。您可以实现缓存:在构造函数中初始化null处的平均值,然后在getAverage()时称为检查平均值字段是否为空;如果为空,则计算它并将其存储在average字段中,然后在任何情况下返回average字段。这样,它将只计算一次,但将在构造函数之外完成。您不应将实现类型用作方法的输入参数。而不是:private-double-meanCalc(ArrayList-myList){Use:private-double-meanCalc(List-myList){谢谢,这太完美了:)你能扩展你的最后一个注释吗?如果有用的话,下面是计划:这个类中还有另一个方法计算这个列表的标准偏差。这个想法是创建另一个类,它在数组上迭代,并在这个计算中使用平均值和标准差,所以我实际上不需要打印out这些结果。@TomKeyte您想要做的是有一个单一的实用程序类,其中只包含接受参数并返回结果的
static
方法。因此,没有实例字段,没有构造函数,没有实例方法。或者,如果您认为处理的数据很大,您也可以使用异步计算。但这太广泛了对于这个问题,我建议您从重构类开始,删除构造函数/实例字段/方法,并使您的
statCalc
method
static
,然后从这里开始。