- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的工作中我偶然发现了这样一个设计问题:
Manager
类的实例如果存在这种情况,前两点将使它成为“每线程单例”。
这是我想出的(代码已简化,我省略了安全检查等):
public class Manager {
private final static ThreadLocal<Manager> local = new ThreadLocal<Manager>();
private int x;
Manager(int argument) { x = argument; }
public static void start(int argument) { local.set(new Manager(argument); }
public static void clean() { local.remove(); }
private void doSomething1() { x++; .... }
private int doSomething2() { if (--x == 0) clean(); ... }
public static void function1() { local.get().doSomething1(); }
public static int function2() { return local.get().doSomething2(); }
}
如您所见,还可以从私有(private)方法中调用 clean 函数。另请注意,通过使用静态函数,对实例的引用永远不会泄漏,因此分配给不同线程的实例不会混合。
这工作得很好,但后来我有另一个要求:
所以我定义了一个接口(interface):
public interface ManagerHandler {
void method1();
int method2();
}
并修改了Manager
类:
public class Manager {
private final static ThreadLocal<ManagerHandler> local = new ThreadLocal<ManagerHandler>();
public static void start(int argument) {
ManagerHandler handler;
// depending on the context initialize handler to whatever class it is necessary
local.set(handler);
}
public static void clean() { local.remove(); }
public static void function1() { local.get().method1(); }
public static int function2() { return local.get().method2(); }
}
一个示例实现如下所示:
public class ExampleManagerImplementation implements ManagerHandler {
private int x;
public ExampleManagerImplementation(int argument) { x = argument; }
public void method1() { x++; .... }
public int method2() { if (--x == 0) Manager.clean(); ... }
}
Manager 类在这里用作外观,将所有调用转发给适当的处理程序。这种方法有一个大问题:我需要在 Manager
类和 ManagerHandler
接口(interface)中定义所有函数。不幸的是 Manager
类不能实现 ManagerHandler
接口(interface),因为它有静态函数而不是方法。
问题是:您能想出一种更好/更简单的方法来实现我上面列出的所有目标,并且不会出现这个问题吗?
最佳答案
你能做的不多,因为你基本上需要通过静态方法来代理接口(interface)方法。我只能想到两种不同的方式来实现相同的功能:
Manager
并使用 ManagerHandler
的注入(inject)实现,它将包含 ThreadLocal
。ManagerHandler
接口(interface)中的方法生成(如“字节码生成”)静态 ManagerAccess
类。就我个人而言,我不认为静态 ManagerAccess
类(包含 ThreadLocal
)是一个严重的设计问题。至少只要它坚持自己的职责集(访问线程范围的实例和代理调用)并且不会在其他任何地方冒险。
关于java - 每线程单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7360172/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!