我怎样才能将以下内容转换为scala。
public class JedisDB {
private static final JedisPool jedisPool = new JedisPool(getJedisPoolConfig());
public static JedisPoolConfig getJedisPool() {
// ..
}
public int getTest123() {
jedisPool.getResource();
// code goes here
}
}
我看到答案会创建一个类和一个伴侣对象,但有人可以向我解释我应该如何以及为什么要这样做?
我应该在伴侣对象中创建我想要公开的静态变量,以及加载用于初始化类中jedisPool的配置文件吗?
我是否可以选择在随播对象中将jedisPool设为公共或私有?
另外(不是为了解决我的问题而是作为一个额外的好处),我在某个地方读到但是并没有完全理解这会让模式让测试变得困难,那么有没有变通方法呢?
答案 0 :(得分:0)
lazy val jedisPool : JedisPool = {
val poolConfig = createPoolConfig(app)
new JedisPool(poolConfig)
}
获取资源
val j = jedisPool.getResource()
确保在完成使用后返回资源。
jedisPool.returnResource(j)
答案 1 :(得分:0)
基本上,如果静态方法将转到伴随对象或任何其他对象,它就不会满足。伴随对象与其他对象不同,因为它具有对其他对象不具有的类/特征的访问权限。但那并不是你的榜样。
带有伴侣对象的样本:
// -- helpers to be able compile
class JedisPoolConfig { }
class JedisPool(p: JedisPoolConfig) {
def getResource = 1
}
// --
// everythis that should be SINGLETON goes into object
object JedisDB {
private lazy val jedisPool = new JedisPool(getJedisPool)
def getJedisPool = new JedisPoolConfig() // or any other implementation
def otherStaticMethod = new JedisDB().anyVal // wow - got access to private val.
}
class JedisDB {
import JedisDB._
def getTest123() = jedisPool.getResource
private val anyVal = "SomeValue";
// other methods
}
// other - non companion object
object JedisDB2 {
// def otherStaticMethod = new JedisDB().anyVal // no luck - no access
}