如何在构造函数中传递一个ArrayList?

问题描述 投票:0回答:1
import java.util.ArrayList;

public class Finance {

ArrayList<String> title = new ArrayList<String>();
ArrayList<Double> moneySpent = new ArrayList<Double>();
Scanner input = new Scanner(System.in);


public Finance(ArrayList<String> title, ArrayList<Double> moneySpent){
this.title = title;
this.moneySpent = moneySpent;
System.out.println(title);
System.out.println(moneySpent);
}

public static void main(String[] args){
Finance entertainment = new Finance(title.add("Movies"), moneySpent.add(1));
}

当我运行这段代码时,我发现有两个错误。

File: D:\Java Programs\Finance.java [行数: 19] Error: Cannot make astatic reference to the non-static field title: 不能对非静态字段title做静态引用

File: D:\JavaPrograms/Finance.java [行:19] Error: 不能对非静态字段moneySpent做静态引用。

arraylist static parameter-passing non-static
1个回答
0
投票

虽然你的重点是在创建一个实例 Finance 有几个概念我想请大家探讨一下。

首先,为了回答你的问题,我想说的是 Finance的构造者签名,定义了合同中的 Finance oject成为一个实例。它期望有两个参数,每个参数都属于 ArrayList 类型.要创建一个 Finance 你必须创建两个数组,一个由字符串组成,另一个由Doubles组成。在这一线 你有很多关于如何初始化数组的想法。

一个例子可以是:

  new Finance(new ArrayList<>(List.of("Movies")), new ArrayList<>(List.of(1.0)));

接下来,我想把你的意识拖到你代码中的这个表达式上。

title.add("Movies")

title 是你想在你的构造函数中初始化的东西 虽然像你这样把它初始化成一个空的ArrayList并不是一个坏主意, 但在其中添加一个元素然后传给你的构造函数让它改变同一个实例对象是没有意义的.

接下来,我想把你的意识拖到你所使用的类型上:在我个人看来,我会使用java的 List 界面 当声明变量时,使用复数来命名任何对象的集合,在你的例子中,请使用 ArrayList 作为 List 接口实现类。例如:

List<String> titles; 
// and
List<Double> expenses;

构造函数上也一样。

public Finance(List<String> titles, List<Double> expenses) {
  //...init variables here
}

注意,我把 moneySpentexpenses. 我这样做,是因为一个钱花在多个时刻 它更有可能是费用和 moneySpent 将是单次花费的金额。

应用单一责任制,我将重构创建一个。Finance 实例到一个separete(静态。为什么是静态的?)方法。

public class Finance {

    List<String> titles;
    List<Double> expenses;
    Scanner input = new Scanner(System.in);

    public Finance(List<String> titles, List<Double> expenses) {
        this.titles = titles;
        this.expenses = expenses;
        System.out.println(this.titles);
        System.out.println(this.expenses);
    }

    public static void main(String[] args) {
        Finance entertainment = createFinance();
    }

    private static Finance createFinance() {
        return new Finance(
                new ArrayList<>(List.of("Movies")),
                new ArrayList<>(List.of(1.0)));
    }
}

最后,考虑在测试的指导下驱动你的实现。我可以推荐。TDD的例子, GOOSJason Gorman的TDD书

© www.soinside.com 2019 - 2024. All rights reserved.