【问题标题】:How do you pass an ArrayList into the constructor?如何将 ArrayList 传递给构造函数?
【发布时间】:2020-06-06 10:24:19
【问题描述】:
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));
}

当我运行这个代码时,我发现了 2 个错误:

文件:D:\Java Programs\Finance.java [行:19] 错误:无法创建 对非静态字段标题的静态引用

文件:D:\Java Programs\Finance.java [行:19] 错误:无法制作静态 引用非静态字段moneySpent

【问题讨论】:

    标签: arraylist static parameter-passing non-static


    【解决方案1】:

    虽然您的重点是创建实例 Finance,但我想邀请您探索的概念很少。

    为了开始并回答您的问题,Finance 的构造函数签名定义了 Finance 对象成为实例的合同。 它需要两个参数,每个参数都是ArrayList 类型。 要创建Finance 的实例,您必须创建两个数组,一个由字符串组成,另一个由双精度组成,on this thread 您对如何初始化数组有很多想法。

    一个例子可以是,

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

    接下来,我想在你的代码中拖动你对这个表达式的认识:

    title.add("Movies")
    

    title 是您希望在构造函数中初始化的内容,尽管像您所做的那样将其初始化为空的 ArrayList 并不是一个坏主意,向它添加一个元素然后将其传递给您的构造函数是没有意义的更改相同的实例对象。

    接下来,我想让您了解您正在使用的类型: 在我个人看来,我会在声明变量时使用java的Listinterface,使用复数来命名任何对象集合,在你的情况下,使用ArrayList作为List接口实现类。例如,

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

    在构造函数上也一样:

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

    请注意,我将 moneySpent 重命名为 expenses。我这样做是因为花费在多个时刻的钱更有可能是费用,moneySpent 将是在单个时刻花费的金额。

    应用单一职责我会将Finance 实例的创建重构为单独的(静态,why static?)方法。

    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 by exampleGOOSJason Gorman's TDD book

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      相关资源
      最近更新 更多