1

我遇到了一个代码,其中实用程序类具有服务客户端的静态引用。这是代码的简化版本

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 之外,我想不出带有远程服务客户端静态引用的此类实用程序类的任何缺点。我有兴趣从设计的角度了解这个类的正确性。

4

3 回答 3

0

这种设计可能遇到的最大问题(除了并发访问和 Juned 的回答中提到的编程错误)是您可能无意中共享状态。无法MyHelper确保传递的客户端引用不会在其他地方使用。这可能会造成封装问题。考虑并发访问问题。即使您创建了该方法isPrime(int i) synchronized,其他一些线程也可能会调用传递给isIntegerPrime的实例。PrimeServiceMyHelper

于 2013-05-07T07:08:08.107 回答
0

您的 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; 
   }
于 2013-05-07T07:01:16.020 回答
0

好吧,如果在第一次调用“isIntegerPrime”之前设置了客户端,您将看不到任何 NullPointerExceptions。您可能会在并行访问该客户端时遇到问题。因此,当同步成为问题时。如果 PrimeService 也在您的控制之下并且可以这样使用,那么也可以选择将 PrimeService 中的方法设为静态。

于 2013-05-07T07:02:33.280 回答