【问题标题】:Java: Access classJava:访问类
【发布时间】:2012-03-10 22:22:06
【问题描述】:

我正在将数据库中的所有玩家加载到 Player 类中,这发生在 DB 类中。

// class DB
 ArrayList<Player> player= new ArrayList();

    public void loadPlayers() {
    try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT * FROM players");
        while (rs.next()) {
            player.add(new Player(rs.getInt("id"), rs.getString("name"), rs.getInt("score"));
        }
        rs.close();
        stmt.close();
    } catch (SQLException ex) {
        System.out.println("error selecting");
        System.err.println(ex);
    }
}


// class Player
    int id, score;
    String name;

    public Customer(int id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    public String getName(int id) {
        return name;
    }


// View
// do i need here something like "ArrayList<Player> player"?

  DB.INSTANCE.loadPlayers(); // I use the Singleton pattern
  System.out.println(player.getName(5));

如何从 DB 以外的其他类访问 Player 类? 例如,我想从 View 调用方法 player.getName(5); 并获取其特定名称。

我是否必须将所有播放器加载到 Array 或 ArrayList 之类的东西中?

【问题讨论】:

  • 我已经更新了代码。但它仍然不起作用......我在System.out.println(player.getName(5)); 得到一个NullPointerException
  • 见鬼——四个答案,没有一个赞成?

标签: java arrays oop class


【解决方案1】:

是的,您需要 CollectionPlayer

while (rs.next()) {
   player = new Player(rs.getInt("id"), rs.getString("name"), rs.getInt("score"));
}

将仅保存从数据库中检索到的最后一个玩家,因为您的班级中只有一个成员。

如果您想要DB.getName(5) 之类的东西,我建议您使用HashMap&lt;Integer,Player&gt; 成员,这样通过 id 查找会很快。

【讨论】:

    【解决方案2】:

    您的DB 类不需要有Player 变量,而是Player集合——即List&lt;Player&gt;。然后,您可以简单地拥有一个返回该集合或该集合副本的方法,以便其他类可以访问它。

    【讨论】:

    • 我如何调用这个集合,比如来自另一个类的ArrayList&lt;Player&gt;(在DB 中定义),例如View?
    【解决方案3】:

    按照您的设置方式,是的,您需要将玩家列表保存在视图中。让 loadPlayers 方法返回一个列表,然后使用该值在 View 中设置一个列表会更有意义。

    【讨论】:

    • DB: public ArrayList loadPlayser() ... return playerView: ArrayList&lt;Players&gt; player ... player.addAll(DB.INSTANCE.loadPlayers())。现在如何从Player调用方法?
    • 使用 for 循环遍历数组列表 "for (Player player : player) { // do stuff };"或者,“players.get(0).callMethodOnPlayer();”
    【解决方案4】:

    现在您将每个玩家加载到DB 中的同一个成员变量中,这不是很有用。您应该在DB 中创建一个方法,该方法返回PlayerList。在这个方法中构造一个ArrayList 并在你的循环中做这样的事情:

    players.add(new Player(rs.getInt("id"), rs.getString("name"), rs.getInt("score")));
    

    然后,从您的视图层,您可以执行以下操作:

    DB db = new DB();
    for (Player p : db.getPlayers())
        System.out.println(p.getName());
    

    更新

    数据库

    public class DB {
    
        ...
    
        private static DB instance;
    
        public static DB getInstance() {
            if (instance == null)
                instance = new DB();
            return instance;
        }
    
        public List<Player> loadPlayers() {
             List<Player> players = new ArrayList<Player>();
             try {
                 Statement stmt = conn.createStatement();
                 rs = stmt.executeQuery("SELECT * FROM players");
                 while (rs.next()) {
                     players.add(new Player(rs.getInt("id"), rs.getString("name"), rs.getInt("score"));
                 }
                 rs.close();
                 stmt.close();
             } catch (SQLException ex) {
                 System.out.println("error selecting");
                 System.err.println(ex);
             }
             return players;
        }
    }
    

    查看

    public class View {
    
        public static void main(String[] args) {
            DB db = DB.getInstance();
            List<Player> players = db.loadPlayers();
            for (Player p : players)
                System.out.println(p.getName());
        }
    
    }
    

    【讨论】:

    • 我必须在View中定义播放器吗?
    • 不,Player 应该是您项目中的一个单独的类,即Player.java
    • 是的,我知道这是一个自己的课程。我的意思是,View 不知道Player,所以我必须在View 中定义它的一个实例吗?
    • 不,视图一旦导入就会知道 Player 类。
    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多