Java实用程序类和通过继承扩展

时间:2011-02-20 18:50:18

标签: java

我有一个带有一些静态方法的实用程序类,我在代码的某些地方使用它们。我现在面临一个问题。我想替换此实用程序类中的函数,以便提供更好的实现。显然,如果没有严重的黑客攻击,就无法直接实现这一目标。

我的问题是:解决这个问题的最佳方法是什么。如何仍然可以使用实用程序类,以便它们仍然可以扩展。我正在考虑为每个使用它们的类包装特定实用程序函数的想法,这样即使实际的实用程序方法至少无法替换,也可以替换调用它的类方法。不过,我很想知道什么是最佳实践。

3 个答案:

答案 0 :(得分:3)

为什么不能只改变实用程序类中静态方法的实现。

只要您不更改方法签名,用户就不会受到影响。

答案 1 :(得分:1)

虽然不完全相同,但可以在以下问题中找到答案:

calling a super method from a static method

就个人而言,我会让它们不是静态方法,而是让它们与它们操纵的任何东西相关。如果您发布一个或两个当前实用程序方法,我可以告诉您如何处理它们。

public interface HashAlgorithm {

    String hash(String s);

    String getType();

}

public class ReallyBadHashAlgorithm implements HashAlgorithm {
    public String hash(String s) {
        // really bad hash! I mean, really bad!
        return "HASH" + Integer.toString(s.hashCode()) + "HASH"; 
    }
    public String getType() {
        return "RRB"; // really really bad = RRB
    }
}

public class Hash<A extends HashAlgorithm> {

    String key;
    String value;
    A algorithm;

    public Hash(String key, A algorithm) {
       this.key = key;
       this.value = null;
       this.algorithm = algorithm;
    }

    public String getHash() {
        if(value == null) {
            value = algorithm.hash(key);
        }
        return value;
    }

    public static void main(String[] args) {
        ReallyBadHashAlgorithm alg = new ReallyBadHashAlgorithm();
        String key = "ABCDEFG";
        Hash hashThis = new Hash<ReallyBadHashAlgorithm>(key,alg);
        System.out.println(key.hashCode()); // to check it

        System.out.println(hashThis.getHash());

    }

}

结果:

C:\Documents and Settings\mule\My Documents>java Hash
-488308668
HASH-488308668HASH

C:\Documents and Settings\mule\My Documents>

答案 2 :(得分:0)

好吧,我真的没有看到你的问题。如果实用程序类的新实现等同于旧版本,则可以替换它,如果没有,现有代码仍然需要能够调用旧函数,因此您无法更改任何内容。那么为什么不只是将新方法添加到可以被新代码使用的Utility类中呢?