直到最近,我们的应用程序在整个应用程序中使用ThreadSafeClientConnManager共享一个Apache HttpClient实例.http客户端实例由单例类保存.
由于我不喜欢单例模式存在的众多问题,我将我的API访问器重构为每线程对象,但现在对于每个线程(在我们的情况下主要是指每个Activity/Service),都会创建一个新的HttpClient实例.
这不是我对这种新方法有问题,但我已经读过Apache人员建议每个应用程序只有一个实例出于性能原因.
在视觉上,我们之前做的是:
HttpClient (thread safe)
|
|
/\
/ \
Activity1...ActivityN
Run Code Online (Sandbox Code Playgroud)
现在,我们这样做:
Activity1 ... ActivityN
| |
| |
HttpClient1 HttpClientN
Run Code Online (Sandbox Code Playgroud)
你们是如何在你的应用程序中做到这一点的?如果您在应用程序和可能有多个并发线程之间共享一个HttpClient,那么如何处理对它的访问?
如果你有一个工厂类来创建某种新的对象,那个factroy类是一个单例,如下所示:
class Database_Factory extends Base_Factory {
private static $factory;
private $objects = array();
public function __get($profile) {
// check for object and return it if it's created before
}
public static function getInstance(){
if (!self::$factory)
self::$factory = new self();
return self::$factory;
}
}
Run Code Online (Sandbox Code Playgroud)
当某个对象需要它自己的工厂时,相同的代码会重复.所以我决定将这个工厂类抽象化,并且只为每个工厂实现特定的例程.但PHP不允许实例化抽象类.
abstract class Base_Factory {
public static function getInstance(){
if (!self::$factory)
self::$factory = new self();
return self::$factory;
}
}
Run Code Online (Sandbox Code Playgroud)
致命错误:无法实例化抽象类Base_Factory
你会怎么做?
我正在构建一个非常小的MVC框架来增加我的PHP知识并挑战自己.我已经到了类开始依赖彼此工作的地步. 依赖注入似乎是解决方案,并被一些大框架使用.
我在Github上发现了Bucket并且已经搞砸了一段时间才能理解基础知识.然而,我无法理解的是,什么时候创建一个容器是合适的?
制作一个大容器,包括可能需要的每个可能的课程,似乎对我来说只是适得其反,我无法想象这是一个好习惯.这似乎是至少糟糕表现的秘诀.
在替代方案中,即制造多个容器,我仍然不知道如何不再需要那些臭气熏天的单身人士.
假设我有以下代码:
$session_container = new bucket_Container();
$session_container->create('Database');
$session_container->create('Database_Sessions');
$log_container = new bucket_Container();
$log_container->create('Database');
$log_container->create('Database_Log');
Run Code Online (Sandbox Code Playgroud)
所以这里我们有两个容器,或者在这种情况下,桶用于两个完全不同的用法,它们是相互依赖的Database.
我的逻辑告诉我,上面的代码将创建Database-class的两个独立实例,这意味着我仍然必须使Database-class成为一个单例来确保我的数据库连接的并发实例没有发生?
它是否正确?
我正在将单例转换为Spring bean,因此如果单例无法初始化,则整个Web应用程序的spring上下文无法正确加载.
使Spring上下文无法正确加载的优点是人们会在部署期间注意并修复配置.与使用'非spring bean'单例相反:当在初始化期间抛出异常时,没有人注意到......直到实际用户抱怨缺少功能.
我的更改正在按预期工作..但我不确定我是否正在做正确的事情.
有什么想法吗?
代码如下所示:
public class MySingleton {
private static MySingleton INSTANCE = null;
private MySingleton(){}
public static MySingleton getInstance(){
if(INSTANCE == null){
synchronized(MySingleton.class){
if(INSTANCE == null){
try{
doWork()
}catch(Exception e){
throw new IllegalStateException("xyz", e);
}
INSTANCE = new MySingleton();
}
}
}
return INSTANCE;
}
private static void doWork() {
// do some work
}
}
Run Code Online (Sandbox Code Playgroud)
在spring config xml中,bean将被定义为:
<bean id="MySingletonBean"
class="com.MySingleton"
factory-method="getInstance" lazy-init="false" singleton="true">
</bean>
Run Code Online (Sandbox Code Playgroud)
注意: 大部分内容类似于本文中讨论的策略:http: //springtips.blogspot.com/2007/06/configuration-hell-remedy-with.html
使用这个单例的类不是spring bean本身..它们只是非春天的pojos,我无法转换为spring.他们必须依靠getInstance()方法来获取Singleton.
编辑2 :( …
我不确定如何模拟枚举单例类.
public enum SingletonObject{
INSTANCE;
private int num;
protected setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
Run Code Online (Sandbox Code Playgroud)
我想在上面的例子中存根getNum(),但我无法弄清楚如何模拟实际的SingletonObject类.我认为使用Powermock准备测试会有所帮助,因为枚举本身就是最终的.
//... rest of test code
@Test
public void test() {
PowerMockito.mock(SingletonObject.class);
when(SingletonObject.INSTANCE.getNum()).thenReturn(1); //does not work
}
Run Code Online (Sandbox Code Playgroud)
这是使用PowerMockMockito 1.4.10和Mockito 1.8.5.
如果我在Tomcat(或任何其他服务器)的单个实例上部署并运行相同应用程序的2个实例.然后将创建一个单独的对象(Singleton类):
所以基本上我想要理解的是,每个JVM都会创建一个Singleton类的单个对象吗?如果应用程序托管在Web服务器(或容器)上,这是如何工作的.
我试图模拟Scala单例对象.特别是,我需要模拟play.api.libs.ws.WS服务组件(被测试的类)中使用的对象.使用Mockito这是不可能的,测试执行失败的方式如下:
[error] MockitoException: :
[error] Cannot mock/spy class play.api.libs.ws.WS$
[error] Mockito cannot mock/spy following:
[error] - final classes
[error] - anonymous classes
[error] - primitive types (GeolocationSpec.scala:18)
Run Code Online (Sandbox Code Playgroud)
在这里阅读,似乎Scalamock允许这样做:
要模拟独立的单例对象,请使用
org.scalamock.annotation.mockObject.
我的服务组件是这样的:
trait GeolocationService {
def wsClient = WS
def getPath(origin: Location, destination: Location): Future[Route]
}
class DefaultGeolocationService extends GeolocationService {
val serviceProviderEndpoint = Play.current.configuration.getString("api.directions.endpoint")
override def getPath(origin: Location, destination: Location): Future[Route] = {
val params = Seq(
"origin" -> s"${origin.lat},${origin.lon}",
"destination" -> s"${destination.lat},${destination.lon}"
);
val resp …Run Code Online (Sandbox Code Playgroud) Kotlin单身人士(更具体地说,对象声明)是否通过构造进行线程安全?如果没有,在Kotlin中编写线程安全单例的最佳做法是什么?
我猜它们是,但我无法在文档中找到任何关于它的明确声明.
因此,使用单例模式的对象只能有一个实例.这在网站上如何运作?
问题:
在java中,我们可以使用双重Checked Locking&volatile编写thead-safe单例:
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance(String arg) {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton(arg);
}
}
}
return localInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
我们怎么能用kotlin写呢?
object A {
object B {}
object C {}
init {
C.hashCode()
}
}
Run Code Online (Sandbox Code Playgroud)
我使用kotlin反编译器来实现
public final class A {
public static final A INSTANCE;
private A() { …Run Code Online (Sandbox Code Playgroud)