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