我有一个带有一些静态方法的实用程序类,我在代码的某些地方使用它们。我现在面临一个问题。我想替换此实用程序类中的函数,以便提供更好的实现。显然,如果没有严重的黑客攻击,就无法直接实现这一目标。
我的问题是:解决这个问题的最佳方法是什么。如何仍然可以使用实用程序类,以便它们仍然可以扩展。我正在考虑为每个使用它们的类包装特定实用程序函数的想法,这样即使实际的实用程序方法至少无法替换,也可以替换调用它的类方法。不过,我很想知道什么是最佳实践。
答案 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类中呢?