Java - 对象列表更改先前的元素

标签 java

我正在尝试从数据库创建对象列表,但是每当我将另一个元素添加到列表末尾时,它都会更改先前元素的值。我在这里看到过类似的问题,但似乎没有一个能帮助我解决问题。

这是 Deck 类的代码

public static class Deck {
    private static int deckid;
    private static String deckName;
    private static int deckCreatorID;
    private static boolean isDeckPublic;
    private static String deckDescription;

    public Deck(int id, String name, int creator, boolean isPublic, String description){
        deckid = id;
        deckName = name;
        deckCreatorID = creator;
        isDeckPublic = isPublic;
        deckDescription = description;
    }

    public String getDeckName(){
        return deckName;
    }

    public String getDeckDescription(){
        return deckDescription;
    }

    public int getDeckCreator(){
        return deckCreatorID;
    }

    public int getDeckid() { return deckid; }

    public boolean getDeckPublic() { return isDeckPublic; }

}

以下是创建对象并将其添加到列表的代码:

public static List<marketplaceController.Deck> getAllCards(){
    List<marketplaceController.Deck> deckList = new ArrayList<>();

    List<Integer> idList = new ArrayList<>();
    List<String> nameList = new ArrayList<>();
    List<Integer> cIdList = new ArrayList<>();
    List<Boolean> publicList = new ArrayList<>();
    List<String> descList = new ArrayList<>();

    try{ // This try-catch block is mainly from https://www.javatpoint.com/example-to-connect-to-the-mysql-database
        Class.forName("com.mysql.cj.jdbc.Driver"); // Define the driver to use
        Connection con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/users","root","UnlockDB.123"); // Connect to the local db
        Statement stmt=con.createStatement();
        ResultSet rs=stmt.executeQuery("select * from decks"); // Execute the query on the db

        while(rs.next()) { // Runs while columns are to be store
            idList.add(rs.getInt(1));
            nameList.add(rs.getString(2));
            cIdList.add(rs.getInt(3));
            publicList.add(rs.getBoolean(4));
            descList.add(rs.getString(5));
        }

        con.close();
    }
    catch(Exception e){
        loginController.popup("An error occurred connecting to the database", "An error occurred");
    }

    for(int i = 0; i < idList.size(); ++i){ // This loop outputs the correct data
        deckList.add(new marketplaceController.Deck(idList.get(i), nameList.get(i), cIdList.get(i), publicList.get(i), descList.get(i)));
        System.out.println(deckList.get(i).getDeckid());
        System.out.println(deckList.get(i).getDeckName());
        System.out.println(deckList.get(i).getDeckCreator());
        System.out.println(deckList.get(i).getDeckPublic());
        System.out.println(deckList.get(i).getDeckDescription());
    }

    for(int i = 0; i < deckList.size(); ++i){ // This outputs the overwitten data
        System.out.println(deckList.get(i).getDeckid());
        System.out.println(deckList.get(i).getDeckName());
        System.out.println(deckList.get(i).getDeckCreator());
        System.out.println(deckList.get(i).getDeckPublic());
        System.out.println(deckList.get(i).getDeckDescription());
    }


    return deckList;
}

当 DeckList 的元素在创建后立即打印时,它们会显示正确的元素,例如

1
TESTDECK
1
true
""

2
TESTDECK2
1
true
""

但是,当我迭代完成的列表并打印内容时,将打印以下内容:

2
TESTDECK2
1
true
""

2
TESTDECK2
1
true
""

这可能是一个非常愚蠢的问题,但我对 Java 还比较陌生,因此非常感谢任何帮助

最佳答案

正如 @jhamon 指出的,当您不知道这意味着什么时,使用静态变量可能是一个非常糟糕的主意。简而言之,静态字段在类的所有实例之间共享,因为它是类的属性而不是实例的属性。因此,当您有 10 个 Deck 实例时,它们中的所有实例都会返回相同的值,例如decid

关于Java - 对象列表更改先前的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61267933/

相关文章:

java - 我加载 .txt 文件时做错了什么?

从回调类执行代码时,Java 性能测试会发生变化。 Java堆栈框架问题?

Java父类(super class)方法: keyword "this" vs "super"

java - 从目录中检索 .class 文件列表

java - 如何为java中的字符串数组变量添加双引号("")

java - Tomcat 主页显示错误

java - 将字符串类型日期更改为日期字符串

java - 更新到 7.7.0 后,Vaadin widgetset 路径发生了变化

java - math.random,只生成一个 0?

java - 如何在线程中断Java时停止URL连接