我在我的java程序中创建了以下单例设计模式
private int OwnerId;
private String OwnerName;
private String OwnerNic;
private String OwnerAddress;
private int OwnerTele;
private String OwnerEmail;
private String OwnerDate;
private static OwnerML instance = new OwnerML();
// make the coosntructor private so that this class cannot be instantiated
private OwnerML(){}
// get the only object available
public static OwnerML getInstance() {
return instance;
}
public int getOwnerId() {
return OwnerId;
}
public void setOwnerId(int OwnerId) {
this.OwnerId = OwnerId;
}
我使用了单独的方法来调用 View 方法
public ArrayList<OwnerML> SelectOwnerData()
{
ArrayList<OwnerML> OwnerList = new ArrayList<OwnerML>();
try {
Connection con = DB.connect();
String selectQ = "select * from owners";
PreparedStatement ps2 = con.prepareStatement(selectQ);
ResultSet rs = ps2.executeQuery();
while (rs.next())
{
OwnerML OwnerData =OwnerML.getInstance();
OwnerData.setOwnerId(rs.getInt(1));
OwnerData.setOwnerName(rs.getString(2));
OwnerData.setOwnerNic(rs.getString(3));
OwnerData.setOwnerAddress(rs.getString(4));
OwnerData.setOwnerTele(rs.getInt(5));
OwnerData.setOwnerEmail(rs.getString(6));
OwnerList.add(OwnerData);
}
rs.close();
ps2.close();
con.close();
通过使用以下方法,我在界面中调用它
ArrayList<OwnerML> ownerList = new OwnerCL().SelectOwnerData();
Object obj[][] = new Object[ownerList.size()][6];
int x = 0;
for (OwnerML t : ownerList) {
obj[x][0] = t.getOwnerId();
obj[x][1] = t.getOwnerName();
obj[x][2] = t.getOwnerNic();
obj[x][3] = t.getOwnerAddress();
obj[x][4] = t.getOwnerTele();
obj[x][5] = t.getOwnerEmail();
x++;
}
ownerTbl.setModel(new javax.swing.table.DefaultTableModel(obj,new Object[]{
"OwneID", "Name", "Nic", "Address", "Tele", "Email", "Date", "VehicleID", "Type", "Model", "Year", "RegNumber"
}));
我目前面临的问题是它总是重复最后一行的数据。 如果有人能帮助我,我将非常感激。
最佳答案
您的设计中存在一个重大缺陷。
我猜 OwnerML
类应该是数据的容器。将其实现为单例是没有意义的。
每次在使用数据库中的结果填充 OwnerList
列表时调用 OwnerML.getInstance()
时,您都会引用同一个类的实例(这就是本质)单例)。
因此,您将始终拥有一个包含对同一对象(单例)的多个引用的列表。
您应该忘记使用 Singleton 作为数据容器(我们称之为数据传输对象 - DTO)。 事实上,Singleton 几乎没有什么用处(特别是异常(exception)是:日志子系统、单一硬件资源的处理程序,也许还有 Spring 式的 bean 工厂)。
简而言之:
将 OwnerML
构造函数公开,然后替换
OwnerML OwnerData =OwnerML.getInstance();
与
OwnerML OwnerData = new OwnerML();
===编辑===
@Anton 的评论是第一个,他是对的。下次我应该打字更快:)
关于java - 使用 Java 中的单一模式填充表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25078076/