【问题标题】:Scala equivalent of static final using a companion objectScala 等价于使用伴随对象的静态 final
【发布时间】:2014-05-22 01:31:16
【问题描述】:

如何将以下内容转换为 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 设为公开还是私有?

另外(不是为了回答我的问题,而是作为一个额外的好处),我在某处读过,但没有完全理解这使得模式使测试变得困难,那么有解决方法吗?

【问题讨论】:

    标签: scala companion-object


    【解决方案1】:
    lazy val jedisPool : JedisPool = {
       val poolConfig = createPoolConfig(app)
       new JedisPool(poolConfig)
     }
    

    获取资源

     val j = jedisPool.getResource()
    

    确保在使用完资源后归还资源。

     jedisPool.returnResource(j)
    

    【讨论】:

    • 我正在寻找类中的内容和伴随对象中的内容,以及一些相关的解释。
    • 在这种情况下您不需要案例类。我描述的 IMO 解决方案更简单,应该可以工作。您不需要仅用于创建 jedisPool 的案例类。如果你注意到了,那lazy val 就是一段代码。
    • 这将是您的JedisPool 增加一些价值并实现Loan Pattern 的绝佳机会 - 使资源自动返回。
    • @millhouse 是的,确实是一个很棒的机会!一旦我完全理解了伴随对象的想法,我就会考虑这样做。
    【解决方案2】:

    基本上,静态方法是否会转到伴生对象或任何其他对象并不重要。伴随对象与其他对象不同,因为它具有对其他对象没有的类/特征的访问权限。但这不是你的例子。

    带有伴随对象的示例:

    // -- 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多