如何在scala中初始化一个val对象?

时间:2017-11-07 15:54:43

标签: scala

应该在很多地方共享redis集群客户端,对吗?与谷歌,所以我使用RedisCli对象:

 object RedisCli {
   val jedisClusterNodes = new java.util.HashSet[HostAndPort]()
   jedisClusterNodes.add(new HostAndPort("192.168.1.100", 6379))
   lazy val jedisCluster = new JedisCluster(jedisClusterNodes)
   //...method with jedisCluster 
 }

问题是如何初始化jedisCluster对象 - 我想在其他对象的main方法中初始化HostAndPort,从属性文件中获取ip命令行传递的文件。我应该在我的环境中使用class RedisCli吗?

我认为我完全迷失在课堂和对象中。

1 个答案:

答案 0 :(得分:2)

在Scala中,应定义单个对象的所有成员。虽然您可以从外部修改var成员,但退后一步并问自己,如果每个客户端都可以修改其成员,那么在您的案例中有一个单例对象是什么意思?你最终只会得到意大利面条代码。

我强烈建议使用依赖注入框架(例如Spring),您可以在特定位置创建bean,然后将它们注入您需要的位置。

简而言之,当您想要定义方法和值(从未见过使用var的情况)时,应该使用singleton objects,这些方法和值并非特定于每个类的实例(想想Java)静态的)。在您的情况下,您似乎想要不同的实例(否则为什么要从客户端代码设置它们),但希望在不同的客户端之间共享某个实例,这正是依赖注入允许您执行的操作。

如果您不想使用DI框架并且可以让客户端随意修改您的实例,那么只需使用类而不是对象。使用class关键字时,可以实例化不同的实例。

class RedisCli(val ip: String, val port: Int) {
 val hostAndPort: HostAndPort = new HostAndPort(ip, port)
 etc...
}

希望这有帮助。