java - 使用 Java 中的单一模式填充表

标签 java design-patterns jtable singleton

我在我的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/

相关文章:

java - 脚本每次对多个请求使用相同的名称,而不是每个请求使用不同的名称

java - 日历月份和年份之前

java - 根据对象实例显示自定义编辑器的设计模式是什么?

java - 跟踪类问题的良好设计模式是什么?

单击单元格时 DefaultTableModel 上的 Java 事件处理

java - 如何在 Google 自定义搜索中指定图像类型

java - 在 Java 中同步访问只读映射的正确方法

java - 类设计问题

java - CellEditorListener 不会检测单元格何时被编辑

swing - 如何实例化一个空的 JTable?