[英]Utility Class with static reference of a client
我遇到了一个代码,其中实用程序类具有服务客户端的静态引用。 这是代码的简化版本
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之外,我无法想到此类带有远程服务客户端静态引用的实用程序类的缺点。 我有兴趣从设计角度了解此类的正确性。
您的setMethod没有用,因为它没有设置静态变量。
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;
}
好吧,如果在“ isIntegerPrime”的第一次调用之前设置了客户端,则不会看到任何NullPointerExceptions。 您可能会在并行访问该客户端时遇到问题。 因此,当同步是一个问题时。 如果PrimeService也处于您的控制之下并且可以这样使用,那么也可以选择将PrimeService中的方法设为静态。
除了并行访问和Juned's Answer中提到的编程错误之外,您可能会遇到此设计最大的问题,即您可能会无意间共享状态。 MyHelper
不能确保所传递的客户端引用没有在其他地方使用。 这可能会带来封装问题。 考虑并发访问问题。 即使你做的方法isPrime(int i)
synchronized
,其他线程可以称之为isIntegerPrime
在PrimeService
传递给实例MyHelper
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.