Scala相当于使用伴随对象的静态final

时间:2014-05-22 01:31:16

标签: scala companion-object

我怎样才能将以下内容转换为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设为公共或私有?

另外(不是为了解决我的问题而是作为一个额外的好处),我在某个地方读到但是并没有完全理解这会让模式让测试变得困难,那么有没有变通方法呢?

2 个答案:

答案 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
}