我遇到了一个代码,其中实用程序类具有服务客户端的静态引用。这是代码的简化版本
public class MyHelper {
//assume that prime service checks if the number is prime
private static PrimeService client;
public static void setClient(PrimeService client) {
MyHelper.client = client;
}
public static boolean isIntegerPrime(int i) {
return client.isIntegerPrime(i);
}
}
对这门课程的设计有何想法?除了意外地将客户端设置为null之外,我无法想到使用远程服务客户端的静态引用的此类实用程序类的任何缺点。我有兴趣从设计角度了解这门课程的正确性。
答案 0 :(得分:0)
您的set方法没有用,因为它没有设置静态变量。
public static void setClient(PrimeService client) {
client = client; //the assignment to this variable has no effect. }
您需要将其更改为
public static void setClient(PrimeService client) {
MyHelper .client = client;
}
答案 1 :(得分:0)
好吧,如果在第一次调用“isIntegerPrime”之前设置了客户端,则不会看到任何NullPointerExceptions。 您可能会遇到与该客户端并行访问的问题。因此,同步是一个问题。 如果PrimeService也在您的控制之下并且这样的使用是可以的,那么也可以选择使PrimeService中的方法成为静态。
答案 2 :(得分:0)
此设计可能遇到的最大问题(除了并发访问和Juned的答案中提到的编程错误)是您可能无意中共享状态。 MyHelper
无法确定传递的客户端引用是否未在其他地方使用。这可能会造成封装问题。考虑并发访问问题。即使您制作方法isPrime(int i)
synchronized
,其他一些帖子也可能会在传递给isIntegerPrime
的{{1}}个实例上调用PrimeService
。