【问题标题】:Java: prefer Utility Class depending on a class instance or static methods?Java:根据类实例或静态方法更喜欢实用程序类?
【发布时间】:2010-12-13 11:47:26
【问题描述】:

我有一个类似这样的 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 实例调用几个方法,所以对我来说第一个解决方案似乎更正确。同时,由于我对我的控制器有很多请求,所以每次我最终都会创建很多 MyObjectUtil 实例,因为 myObject 与特定的 http 请求相关。

在我的情况下我应该走哪条路,在其他情况下我应该如何选择?

MyObject 被一些实用程序类以特定方式使用,例如 MyObjectXXXUtil MyObjectYYYUtil。我想将这些 Util 方法(修改 myObject 并检查特定状态)排除在特定的 MyObject 实现之外,因为它们并不特定于此。许多 Util 函数可以以某种方式与 MyObject 交互。

【问题讨论】:

    标签: java static-methods utility instances


    【解决方案1】:

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

    【讨论】:

    • 我同意这一点,谢谢。 MyObject 被一些实用程序类以特定方式使用,例如 MyObjectXXXUtil MyObjectYYYUtil。我想将这些 Util 方法(修改 myObject 并检查特定状态)排除在特定的 MyObject 实现之外,因为它们并不特定于此。许多 Util 函数可以以某种方式与 MyObject 交互。
    • 如果 util 是用于像 TimeZone 这样的本机 java 对象怎么办?在那种情况下我会怎么做?我应该创建一个名为 TimeZoneUtils 的类还是应该创建一个扩展 TimeZone 的类?
    【解决方案2】:

    以下是之前讨论过的其他一些主题:

    Java Utility Class vs. Service

    Java Abstract Class or Static Utility Class Design Choice

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多