2

I am going to create a utility Class APIUtility, it wraps a unique Object token generated by the server engine, once I used my username and password to get the Object token, I get the door is opening so I can access the engine anytimes if the token is still alive.

I want to use existing 'APIUtility' once I get the access to avoid unnecessary authentication effort. and with this 'APIUtility' I get directly call many functions to server engine. but right now, I have some else classes, they are under different place to take different responsibility: e.g. build data, logic validation, condition elevation, so these classes both need to have a base line use APIUtility to access engine data, do anybody have good design for this? because I fell it every class have a variable APIUtility we need set it for create a instance of these classes is not a good design.

4

6 回答 6

2

在我看来,你走在正确的轨道上;简单总是最好的。

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

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

仅供参考,这就是某些人所说的“穷人的依赖注入”。

于 2013-05-15T05:10:06.340 回答
0

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

于 2013-05-15T05:08:17.863 回答
0

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

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

于 2013-05-15T06:08:04.093 回答
0

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

总的来说,虽然我不得不说你的职责可能有点混乱。有什么理由它不能是静态 util 类(它将令牌作为参数)?如果不是,那么您也可以这样做,如果是,您可能应该为该类考虑一个更有用的名称。

于 2013-05-15T06:51:20.963 回答
0

我会使用带有依赖注入和适当bean 范围的 spring 。

于 2013-05-15T06:40:18.010 回答
-1

您可以使用类型的变量ThreadLocal

ThreadLocal可以认为是访问范围,如请求范围会话范围。这是一个线程范围。您可以在其中设置任何对象,ThreadLocal并且该对象对于访问该对象的特定线程将是全局的和本地的。全球本地? 让我解释:

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

Java Thread Local – 如何使用和代码示例

例如你可以有这样的东西:

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();
    } 
    
}

也可以看看:

于 2013-05-15T05:49:40.483 回答