首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态实用程序类与bean相比有什么问题?

静态实用程序类与bean相比有什么问题?
EN

Code Review用户
提问于 2012-08-05 10:08:43
回答 2查看 7.9K关注 0票数 3

我倾向于使这些方法成为静态的:

代码语言:javascript
复制
package net.bounceme.dur.usenet.driver;

import java.util.List;
import java.util.logging.Logger;
import javax.mail.Folder;
import javax.mail.Message;
import javax.persistence.*;
import net.bounceme.dur.usenet.model.Article;
import net.bounceme.dur.usenet.model.Newsgroup;

class DatabaseUtils {

    private static final Logger LOG = Logger.getLogger(DatabaseUtils.class.getName());
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("USENETPU");
    private EntityManager em = emf.createEntityManager();

    public int getMax(Folder folder) {
        int max = 0;
        String ng = folder.getFullName();
        String queryString = "select max(article.messageNumber) from Article article left join article.newsgroup newsgroup where newsgroup.newsgroup = '" + ng + "'";
        try {
            max = (Integer) em.createQuery(queryString).getSingleResult();
        } catch (Exception e) {
            LOG.info("setting max to zero");
        }
        LOG.severe(folder.getFullName() + "\t" + max);
        return max;
    }

    public void persistArticle(Message message, Folder folder) {
        em.getTransaction().begin();
        String fullNewsgroupName = folder.getFullName();
        Newsgroup newsgroup = null;
        int max = getMax(folder);
        TypedQuery<Newsgroup> query = em.createQuery("SELECT n FROM Newsgroup n WHERE n.newsgroup = :newsGroupParam", Newsgroup.class);
        query.setParameter("newsGroupParam", fullNewsgroupName);
        try {
            newsgroup = query.getSingleResult();
            LOG.fine("found " + query.getSingleResult());
        } catch (javax.persistence.NoResultException e) {
            LOG.fine(e + "\ncould not find " + fullNewsgroupName);
            newsgroup = new Newsgroup(folder);
            em.persist(newsgroup);
        } catch (NonUniqueResultException e) {
            LOG.warning("\nshould never happen\t" + fullNewsgroupName);
        }
        Article article = new Article(message, newsgroup);
        em.persist(article);
        em.getTransaction().commit();
    }

    public void close() {
        em.close();
        emf.close();//necessary?
    }
}

不过,我很肯定我是少数派!为什么?

快速查看数学就会发现,这并不是一种奇怪或奇怪的方法。对象本身不保持任何状态,所以为什么bean或POJO比静态方法更好呢?

EN

回答 2

Code Review用户

回答已采纳

发布于 2012-08-05 13:22:04

实际上,该对象包含一个具有状态的实体管理器。在一个简单的应用程序中,只有一个共享的实体管理器可以工作,但是如果您将它变成Java应用程序中的EJB,那么您肯定希望每个请求都使用它自己的实体管理器。

票数 4
EN

Code Review用户

发布于 2012-08-05 20:51:54

静态帮助类使测试更加困难。Nick有一篇关于这个主题的好文章:杀死帮手类,第二部分

模拟非静态方法更接近OOP,比静态方法更容易。另一个好处是,您将有简单的测试:实用程序/助手类的简单测试和实用程序类客户端的简单测试;客户端类的测试不需要知道实用程序类的内部结构,并且不需要一个DatabaseUtilsTestHelper类将helper类的模拟逻辑保存在一个地方。链接的文章值得一读。

其他一些注意事项:

  • 不要使用像ng这样的短变量名。它们很难读懂。
  • persistArticle并不是在每个路径上都关闭事务。如果它仍然处于活动状态,您应该在finally块中回滚: EntityTransaction事务= em.getTransaction();transaction.begin();尝试{.transaction.commit();}最后{ if (transaction.isActive()) { transaction.rollback();}
  • persistArticle不使用max的值,因此getMax调用似乎没有必要。
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/14347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档