在java构造函数中声明ArrayList

在java构造函数中声明ArrayList,java,arraylist,constructor,Java,Arraylist,Constructor,我正在做一个项目,我被教导在构造函数中实例化变量。我用ArrayList的想法做这件事有点困难。你能推荐一些最佳实践吗?我需要用实例变量定义ArrayList还是在构造函数中定义它。谢谢你的建议!下面我举了一个例子: //imports import java.util.*; import java.lang.*; public class ArrayListConstructorDemo { //instance variables/attributes String string; Li

我正在做一个项目,我被教导在构造函数中实例化变量。我用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
//导入
导入java.util.*;
导入java.lang.*;
公共类ArrayListConstructorDemo
{
//实例变量/属性
字符串字符串;
List List;//例如,此行是否需要说List List=new ArrayList();
//建设者
公共ArrayListConstructorDemo()
{
String=“null”;
List List=new ArrayList();//我是否可以在这里执行此操作,而不是6行?
}//结束默认构造函数
公共ArrayListConstructorDemo(字符串、列表)
{
this.string=string;
this.list=列表;
}//结束泛型构造函数
//观察者/获取者/访问者
公共字符串getString(){return String;}//end方法getString()
public List getList(){return List;}//end方法getList()
//变压器/设定器/变换器
public void setable(字符串){this.String=String;}
公共void集合值(字符串列表)
{
//用于(字符串s:测试)
//  {
list.add(这个列表);
//  }
}
公共字符串toString()
{
return“这是ArrayListConstructorDemo类的通用toString方法”;
}//端到串
公共静态void main(字符串[]args)
{
ArrayListConstructorDemo alcd=新的ArrayListConstructorDemo();
System.out.println(alcd.list.size());
//一般测试列表
List bleh=new ArrayList();
b.添加(“b1”);
System.out.println(bleh.get(0));
}//结束方法main()
}//端类ArrayListConstructorDemo

如果要在构造函数中声明它,则(很可能)要声明外部字段,因此需要:

list = new ArrayList<String>();
list=newarraylist();
当前,您正在隐藏
列表
类变量,这意味着您正在创建
列表
新实例,而不是初始化
列表
实例变量


我个人更喜欢在声明时初始化它,所以你以前有。我更喜欢这样做,以使代码更简洁,如果你自学了这一习惯,你很可能不会忘记初始化它。

如果你想在构造函数中声明它,你可以使用以下代码:

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

   private ArrayList<String> name;
私有数组列表名;
然后在构造函数中:

    name = new ArrayList<String>();
name=newarraylist();
将其设置为字段将非常有用,因为这样您就可以创建访问器/变异器方法,以便从不同的类检索和使用列表,而不必将其声明为公共的(这很少是一件好事)。

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

list=newarraylist();

java还为您提供了初始化字段的功能


参见初始化实例成员一般做法是在构造函数之前声明,然后在构造函数中初始化。 下面是一个例子:
class-myClass
数组列表字符串
公共myClass()
{
strings=newarraylist();
}

您如何做到这一点

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);
    // }
}
public void setValues(列表){
//用于(字符串s:测试)
// {
list.add(这个列表);
// }
}
关于在构造函数中声明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
字符串;
列表列表;//例如,这一行是否需要显示列表
//列表=新的ArrayList();
//建设者
公共ArrayListConstructorDemo(){
string=“null”;
list=new ArrayList();//这里有什么我可以做的吗
//而不是排6队?
}//结束默认构造函数

不要混淆声明和初始化。还要注意不要对变量进行阴影处理。(这些都是关键词。)为什么要在构造函数中声明变量?所以我只是为了简洁起见才这么做的。你是完全正确的,实际上我不是!Rohit I被教导,在默认构造函数中,任何需要有一个值以供以后访问的内容都应该在默认构造函数中实例化,而不是在此之前添加默认值,这可以防止以后出现随机值浮动的问题。Rohit指的是一个称为阴影的概念。如果您使用名称
list
声明了一个字段,然后在构造函数中声明了一个名为
list
的新变量,那么在构造函数中引用
list
时,您将引用局部变量而不是字段。明白了,这感觉就像我的问题所在。按照你的建议更改代码解决了我的问题。非常感谢你的帮助!该方法还没有完成,它最终将类似于publicvoidsetvalues(List List,String…strings){for(String s:strings){List.add(this.s);}}}或类似的东西。。。现在听起来不错!!顺便说一句,在预定义的关键字中使用变量名是不好的做法!
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