在许多类之间共享类实例的最佳设计

时间:2013-05-15 05:04:32

标签: java oop

我打算创建一个实用程序类APIUtility,它包装了一个由服务器引擎生成的唯一对象令牌,一旦我使用我的用户名和密码获取对象令牌,我就开门了,所以我如果令牌仍然存在,则可以随时访问引擎。

我希望在获得访问权限后使用现有的“APIUtility”,以避免不必要的身份验证工作。通过这个'APIUtility',我直接将许多函数调用到服务器引擎。但是现在,我还有其他一些课程,他们在不同的地方承担不同的责任:例如构建数据,逻辑验证,条件提升,所以这些类都需要有一个基线使用APIUtility来访问引擎数据,有人为此设计好吗?因为我认为每个类都有一个变量APIUtility我们需要设置它来创建这些类的实例并不是一个好的设计。

6 个答案:

答案 0 :(得分:2)

我认为你走在正确的轨道上;简单总是最好的。

让所有需要APIUtility的类将一个实例作为构造函数中的依赖项。

这样,如果您需要/想要,您可以只实例化APIUtility一次并让它共享。

仅供参考,这是有些人所说的“穷人的依赖注射”。

答案 1 :(得分:0)

我会使用依赖注入,Spring框架。另一种选择是使用Singleton模式。

答案 2 :(得分:0)

你应该采用依赖注入\ IOC框架,如CDI或spring。我个人更喜欢CDI,但这是个人选择。

使用依赖注入,Container管理您的类之间的关联。如果访问具有需要注入的元素的类,则编译器通过Constructor-Injection(Constructor)或Setter-Injection(Setter-Method)设置它们。

答案 3 :(得分:0)

我会使用带有dependency injection的春天和适当的bean scope

答案 4 :(得分:0)

这绝对是控制反转或战略模式的一种情况。

总的来说,虽然我不得不说,也许你的责任有点混乱。有什么理由它不能是一个静态的util类(它将一个标记作为参数)?如果不是,那么你可以这样做,如果是的话,你应该想到一个更有用的名字。

答案 5 :(得分:-1)

您可以使用ThreadLocal类型的变量。

  

ThreadLocal可以被视为访问范围,例如请求范围会话范围。这是一个线程范围。您可以在ThreadLocal中设置任何对象,此对象将 global local 到访问此对象的特定线程。 全球本地?让我解释一下:

     
      
  • 存储在ThreadLocal中的值 global 到线程,这意味着可以从该线程内的任何位置访问它们。如果一个线程调用来自多个类的方法,那么所有方法都可以看到由其他方法设置的ThreadLocal变量(因为它们在同一个线程中执行)。不需要显式传递该值。这就像你使用全局变量一样。
  •   
  • 存储在 ThreadLocal 中的值是线程的本地值,这意味着每个线程都有自己的ThreadLocal变量。一个线程无法访问/修改其他线程的ThreadLocal变量。
  •   

Java Thread Local – How to use and code sample

e.g。你可以有类似的东西:

public class APIUtility {

    private static ThreadLocal<Engine> ENGINE_LOCAL = new ThreadLocal<Engine>();

    public static void setEngine(Engine engine) {
        ENGINE_LOCAL.set(engine);
    }

    public static Engine getEngine() {
        ENGINE_LOCAL.get();
    }

}

class NameValidator {

    public void foo() {
        Object obj = APIUtility.getEngine().getSomething();
    } 

}

另见: