【问题标题】:Java Utility Classes and Extension through InheritanceJava 实用程序类和通过继承进行的扩展
【发布时间】:2011-02-20 18:50:17
【问题描述】:

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

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

【问题讨论】:

  • 1+ 用于尝试寻找最佳实践。

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    虽然不是完全重复,但可以在以下问题中找到答案:

    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>
    

    【讨论】:

    • 假设您有一个静态实用程序方法,用于生成实用程序类 Util 中定义的 sha1 哈希。在代码的某些地方,您可能会看到类似 Util.sha1(something) 的内容。现在假设我们想用更好的东西来改变 sha1 函数的实现。除非类的编程有所不同,否则这是不可能的......
    • 底线是避免使用实用程序类——它们并不像听起来那样实用!表面上它们很好,但它们并不能很好地适应 OO 原则。相反,为您使用的东西创建类,而不是实用程序类。
    【解决方案3】:

    嗯,我真的没有看到你的问题。如果你的实用程序类的新实现等同于旧版本,你可以替换它,如果不是,现有代码仍然需要能够调用旧函数,所以你不能在那里改变任何东西。那么为什么不直接在 Utility 类中添加新代码可以使用的新方法呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多