Java:根据类实例或静态方法更喜欢Utility Class?

时间:2010-12-13 11:47:27

标签: java static-methods utility instances

我有一个类似这样的Java类

public class MyObjectUtil {

    private final MyObject myObject;

    public MyObjectUtil (MyObject myObject){            
        this.myObject = myObject;    
    }

    public boolean isSomeInfoPresentValid() {
        return myObject.isSomething();
    }

    public void modifyMyObjectInSomeWay(String blah) {
        myObject.modify(blah);
    }

}

每次我都要实例化我的Utility类以与MyObject的特定实例进行交互。

myObject作为Session obj

出现
MyObjectUtil myObjUtil = new MyObjectUtil(myObject);
myObjUtil.modifyMyObjectInSomeWay("blah");
boolean valid = myObjUtil.isSomeInfoPresentValid();

为了获得相同的结果,我可以使用静态函数,每次使用myObject作为方法参数执行相同的操作。

public class MyObjectUtil {

    public static boolean isSomeInfoPresentValid(MyObject myObject) {
        return myObject.isSomething();
    }

    public static void modifyMyObjectInSomeWay(MyObject myObject, String blah) {
        myObject.modify(blah);
    }

}

我不知道应该走哪条路 我在我的控制器中使用Util类,有时我需要针对同一个myObject实例调用几个方法,所以对我来说第一个解决方案似乎更正确。同时,由于myObject与特定的http请求相关,因此我每次都要对我的控制器提出许多请求,因此每次都会创建很多MyObjectUtil实例。

在我的情况下,我应该选择哪种方式?在其他情况下我应该如何选择?

某些Utilities类(如MyObjectXXXUtil MyObjectYYYUtil)以特定方式使用MyObject。我想从特定的MyObject实现中保留这些Util方法(修改myObject并检查特定状态),因为它们并不特定于此。许多Util函数可以以某种方式与MyObject交互。

2 个答案:

答案 0 :(得分:7)

如果MyObjectUtil中的方法完全依赖于MyObject,那么我只是将它们放在MyObject中。当你有很多可以使用这些方法的类时,实用程序类很有用。

答案 1 :(得分:2)

以下是其他一些已经讨论过这个问题的线程:

Java Utility Class vs. Service

Java Abstract Class or Static Utility Class Design Choice

对我来说,一切都取决于国家。如果实用程序类不需要状态,那么我会选择静态方法。

您描述的方法也可能存在于对象本身作为对该域对象执行的有效操作。