繁体   English   中英

带有客户端静态引用的实用程序类

[英]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 ,其他线程可以称之为isIntegerPrimePrimeService传递给实例MyHelper

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM