在Java中为类对象提供不同的ArrayLists

时间:2011-11-20 22:45:48

标签: java class arraylist

我有一个类,这个类有一个公共元素ArrayList myList。(我的类中也有其他元素,但它们与此元素无关)

我要做的是为不同的Class对象使用不同的ArrayLists。但是当我尝试编写代码时,即使我使用不同的类对象,代码也会保留一个ArrayList中的每个条目。我做错了什么?

这是我试过的: 我的班级:

public class myClass {

public static ArrayList myList;
public static ArrayList getList() {
    return myList;
}
public static void setList(ArrayList myList) {
    myClass.myList = myList;
}

主要:

 myClass my = new myClass();
 myClass my2 = new myClass();
 ArrayList tmp = new ArrayList();
 ArrayList tmp2 = new ArrayList();
 tmp.add("aaaaa");
 tmp.add("bbbbb");
 tmp2.add("ccccc");
 tmp2.add("ddddd");
 my.setList(tmp);
 my2.setList(tmp2);
 for(int i=0;i<my.getList().size();i++)
 {
 System.out.println(my.getList().get(i));
 }

这个主要的输出是:

ccccc
ddddd

但我希望它是:

aaaaa
bbbbb

我做错了什么?

4 个答案:

答案 0 :(得分:3)

你声明了myClass#myList static,这意味着在CLASS myClass中只存在一个myList实例。声明它是非静态的,包括getter和setter,为my和my2设置不同的实例,你很高兴。

答案 1 :(得分:0)

你在课堂上使用静态。

删除班级变量的静态关键字,你应该没问题。静态是类作用域,因此将跨对象共享。

答案 2 :(得分:0)

按如下方式修改您的课程

public class myClass {

    public ArrayList myList;
    public ArrayList getList() {
    return myList;
}
public void setList(ArrayList myList) {
    listler.myList = myList;
}

您使用的是静态 ArrayList myList,这是您班级myClass的所有对象所共有的。因此,你没有得到你期望的。如果您需要将ArrayList myList分别用于该类的所有对象,请避免使用静态。


Java允许您以对象的方式访问类的静态成员,并将它们与类名相关联,但将静态成员与类对象关联是一种不好的做法。


将静态成员本身与类对象相关联实际上是语言设计本身的一个缺陷(因此,应避免使用对象访问它们),这些缺陷由C#更正,因此在C#中,您无法将静态成员与相应的类对象相关联


在java中,如果您尝试使用相应的类对象访问静态成员,某些IDE可能会发出警告或错误。

答案 3 :(得分:0)

正如其他评论所指出的那样,您将ArrayList声明为 static ,这意味着它在所有对象实例之间共享class - 如下所示:

my.setList(tmp);
my2.setList(tmp2);

...第二个 setList 会覆盖第一个。

阅读Singleton模式,以获得静态字段使用位置的一个很好的例子:

Singleton pattern

顺便说一句,考虑将值传递给构造函数并仅提供getter,从而封装ArrayList的使用并使值不可变 - 例如:

myClass my = new myClass("aaaa", "bbbb");
String element = my.get(0);

最后,如果使用Java 5或6,请考虑在使用集合/列表时使用泛型:

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

希望有所帮助。