在Java构造函数中声明ArrayList

6

我正在进行一个项目,我被教导在构造函数中实例化变量。然而,在ArrayList方面我遇到了一些问题。您可以推荐一些最佳实践吗?我需要在实例变量中定义ArrayList吗?还是可以在构造函数中实现呢?谢谢您的建议!以下是我所说的示例:

//imports
import java.util.*;
import java.lang.*;

public class ArrayListConstructorDemo
{
//instance variables/attributes

String string;
List<String> list;// for example does this line need to say List<String> list = new ArrayList<String>();

//constructors
public ArrayListConstructorDemo()
{
    String string = "null";
    List<String> list = new ArrayList<String>();//is there anyway I can do this here instead of 6 lines up?
}//end default constructor
public ArrayListConstructorDemo(String string,List<String> list)
{
    this.string = string;
    this.list = list;
}//end generic constructor

//observers/getters/accessors
 public String getString(){return string;}//end method getString()
 public List<String> getList(){return list;}//end method getList()

//transformers/setters/mutators
     public void setTable(String string){this.string = string;}
     public void setValues(String list)
     {

    //  for(String s : test) 
    //  {
            list.add(this.list);
    //  }
     }
public String toString()
{
    return "this is a generic toString method for the class ArrayListConstructorDemo";
}//end toString

public static void main(String[] args)  
{
    ArrayListConstructorDemo alcd = new ArrayListConstructorDemo();
    System.out.println(alcd.list.size());

//test Lists in general
    List<String> bleh = new ArrayList<String>();
    bleh.add("b1");
    System.out.println(bleh.get(0));
}//end method main()
}//end class ArrayListConstructorDemo

1
不要混淆“声明”和“初始化”。同时要小心不要“遮蔽”变量。(这些都是关键字。) - Sotirios Delimanolis
为什么你在构造函数中重新声明变量? - Rohit Jain
Sotiros 我只是为了简洁而这样做。你完全正确,在实践中我不会这样做!Rohit 我被教导在默认构造函数中,任何需要具有值以便稍后访问的内容都应该在默认构造函数中实例化,而不是在此之前添加默认值,这可以防止您以后遇到随机值漂浮的问题。 - demuro1
Rohit 正在提到一个叫做“影子变量”的概念。如果你声明了一个名为 list 的字段,然后在构造函数中声明了一个新变量 list,那么在构造函数中引用 list 时,你将引用局部变量而不是字段。 - Sotirios Delimanolis
6个回答

5

变更

List<String> list = new ArrayList<String>();

to

list = new ArrayList<String>();

5
如果你想在构造函数中声明它,你可以使用以下代码:
     ArrayList<String> name = new ArrayList<String>();

否则,您可以将其声明为字段,然后在构造函数中进行初始化。
   private ArrayList<String> name;

然后在构造函数中:

    name = new ArrayList<String>();

将其变为一个字段会非常有用,因为这样你就可以创建访问器/修改器方法,以便从不同的类中检索和使用列表,而不必声明它为公开的(这很少是一件好事)。

2

如果你想在构造函数中声明它,那么你(很可能)想要声明外部字段,所以你需要:

list = new ArrayList<String>();

目前,你正在影子化List<String> list类变量,这意味着你正在创建一个新的list实例,而不是初始化list实例变量。

个人而言,我更喜欢在声明时初始化它,就像你之前所做的那样。我喜欢这样做是为了使代码更简洁,如果你养成这个习惯,你很可能不会忘记初始化它。


2

通常的做法是在构造函数之前声明变量,在构造函数中进行初始化。 以下是一个例子:
class myClass ArrayList<String> strings public myClass() { strings=new ArrayList<String>(); }


2
你如何做到这一点?
public void setValues(String list) {

    // for(String s : test)
    // {
    list.add(this.list);
    // }
}

没有类似于add()这样的方法来操作字符串,相反,您可以使用以下方法:

public void setValues(List<String> list) {

    // for(String s : test)
    // {
    list.add(this.list);
    // }
}

关于在构造函数中声明ArrayList,可以这样做:

String string;
List<String> list;// for example does this line need to say List<String>
                    // list = new ArrayList<String>();

// constructors
public ArrayListConstructorDemo() {
    string = "null";
    list = new ArrayList<String>();// is there anyway I can do this here
                                    // instead of 6 lines up?
}// end default constructor

那个方法还没有完成,最终会变成类似这样的公共方法: void setValues(List<String> list, String... strings) { for(String s : strings){ list.add(this.s); } } 或者类似于此。 - demuro1
嗯...那听起来还不错!! 顺便说一句,使用预定义关键字作为变量名是不好的编程习惯! - Roshan Shahukhal

0

1
在哪里提到Java更喜欢将列表初始化为字段? - Emad Aghaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接