论坛首页 入门技术论坛

到底该不该用静态方法?

浏览 2630 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-06-27  
本人是学生,最近在做一个BBS程序,在一些数据库映射上遇到了一些问题。我并没有使用任何框架,因为还不太会。自己写了一些数据库到Java对象的映射。比如下面。
java 代码
 
  1. //代表帖子的类,只是为了说明问题,代码我尽量缩减  
  2. public class Topic{  
  3.   private int id;                      //帖子编号  
  4.   private String title;               //标题  
  5.   private String content;          //内容  
  6.   private String boardId;          //所在版面的ID  
  7.   private static ArrayList<topic> findByBoardId(String id){  </topic>
  8.        ArrayList<topic> l = new ArrayList<topic>();  </topic></topic>
  9.        //DB是我自定义个一个数据库连接类,返回的是查询结果。  
  10.        ResultSet rs = DB.query("SELECT * FROM topics WHERE board_id=" + id);  
  11.        while(rs.next()){  
  12.             //把每条记录封装到对象中,然后放到容器里。  
  13.             l.add(new Topic(rs.getString("id"),rs.getString("title"),
  14.                     rs.getString("content"),rs.getString("board_id")));  
  15.        }  
  16.   }  
  17.   
  18. //其他构造方法,get,set方法等生就省略了。  
  19. }  

我在前台调用它的静态方法,获得一个包含若干的Topic对象的容器,然后在依次输出的界面上。由于没有项目经验,所以不知道该怎么去设计,这样设计好不好,我对设计模式不是很清楚,所以想自己练一个项目实践一下。

还有一个问题就是,如果我想做一个发帖子的功能,那么这个方法我感觉应该还放在Topic这个类里面,可是这个方法我依然用的是静态方法,之前也想过用实例方法,不过我感觉发帖子这个功能没有必要再实例化一次对象。
java 代码
 
  1. public static void PostTopic(String title,String content,String boardId){  
  2.     ArrayList<string> list = new ArrayList<string>();  </string></string>
  3.     list.add(title);  
  4.     list.add(content);  
  5.     list.add(boarId);  
  6.    //这个方法的功能是,根据SQL语句和参数容器,来使用预编译的SQL类,来插入数据  
  7.     DB,update("INSERT INTO topic (title,content,board_id) VALUES (?,?,?)",list);  
  8. }  

表达能力有限,可能有的地方说的不太明白,关于实际项目的设计方法,我一直不太明白,我知道这样设计有点像结构化的风格而不是面向对象,怎么做出可维护的程序,还请有耐心的朋友赐教吧,呵呵
   发表时间:2007-06-27  
我觉得你的设计有点问题。Topic这个类应该设计成一个独立的纯粹的PO类。里面只涉及属性和set,get方法。

具体的对Topic的存取的方法应该放到业务逻辑层去处理。

0 请登录后投票
   发表时间:2007-06-27  
至于你说的静态方法的问题,我认为对于无状态的对象来说,尽量使用静态方法。毕竟可以节省内存。

你Topic类设计的挺奇怪:既然Topic类有id属性,为什么findByBoardId()方法还要设置个String id的参数呢?如果就按照你的设计方法,应该这样:

public class Topic{   
  private int id;                      //帖子编号   
  private String title;               //标题   
  private String content;          //内容   
  private String boardId;          //所在版面的ID   
  public ArrayList findByBoardId(){   
       ArrayList l = new ArrayList();   
       //DB是我自定义个一个数据库连接类,返回的是查询结果。   
       ResultSet rs = DB.query("SELECT * FROM topics WHERE board_id=" + this.id);   
       while(rs.next()){   
            //把每条记录封装到对象中,然后放到容器里。   
            l.add(new Topic(rs.getString("id"),rs.getString("title"), 
                    rs.getString("content"),rs.getString("board_id")));   
       }   
  }  


如上设计的话,你的那些方法就不能采用静态方法了。
0 请登录后投票
   发表时间:2007-06-27  
谢谢你的指导,明白了很多了,不过看来这里不太适合我这种新手。。。提个问题被减了20分,郁闷
0 请登录后投票
   发表时间:2007-06-27  
学到东西就好,别太在意分数。下次发帖前考虑一下发到哪个版里更合适就好了
0 请登录后投票
   发表时间:2007-06-28  
Rocwo 写道
至于你说的静态方法的问题,我认为对于无状态的对象来说,尽量使用静态方法。毕竟可以节省内存。

你Topic类设计的挺奇怪:既然Topic类有id属性,为什么findByBoardId()方法还要设置个String id的参数呢?如果就按照你的设计方法,应该这样:

public class Topic{   
  private int id;                      //帖子编号   
  private String title;               //标题   
  private String content;          //内容   
  private String boardId;          //所在版面的ID   
  public ArrayList findByBoardId(){   
       ArrayList l = new ArrayList();   
       //DB是我自定义个一个数据库连接类,返回的是查询结果。   
       ResultSet rs = DB.query("SELECT * FROM topics WHERE board_id=" + this.id);   
       while(rs.next()){   
            //把每条记录封装到对象中,然后放到容器里。   
            l.add(new Topic(rs.getString("id"),rs.getString("title"), 
                    rs.getString("content"),rs.getString("board_id")));   
       }   
  }  


如上设计的话,你的那些方法就不能采用静态方法了。


静态方法并不能节省内存,只是减少了对象创建的开销,相反,静态方法越多,所占用的内存就越多,同时也违背了OO,有利有弊,具体使用否,只能自己权衡得失了,没有说哪个错哪个对的。
0 请登录后投票
   发表时间:2007-06-28  
我那个方法的ID 不是帖子ID,而是版面Id,因为我要查询的是特定板块的帖子。然后用这个方法返回对象的集合,我总感觉这样不太好,但是又想不出更好的方法
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics