Scala实例变量的最佳实践

时间:2011-01-31 11:23:58

标签: scala

如何将以下Java代码转换为Scala?

class ClassA {
    private int field1;
    private int field2;

    public ClassA() {
        field1 = 1;
        field2 = 2;
    }
}

我可以看到两个选项:

class ClassA(val field1: Int, val field2: Int) {
   ....
}

或者

class ClassA {
   val field1: Int = 1
   val field2: Int = 2
}

建议什么,为什么?

5 个答案:

答案 0 :(得分:18)

没有从Java到Scala的简单转换,它取决于上下文:

  • Java中的变量是否可变?如果是(否则它们应该是Java中的最终版):在Scala中使它们不可变是否有意义?
  • 构造函数应该在Scala中公开吗?将是一个工厂(例如,一个申请方法) 伴侣对象)更合适吗?
  • 为什么变量是私有的?他们有吸气剂和/或吸气剂吗?
  • 什么时候需要变量,让它们变得懒惰是否有意义?
  • 如果值是不可变的并且是暴露的,它们在模式匹配中是否有用?案例类别是正确的选择吗?
  • 是否可以对变量进行分组(例如在元组中)以简化API和访问?

你知道,有很多考虑因素。我建议学习Scala的可能性,并尝试不同的方法,否则你会陷入“Scala as better Java”陷阱的时间超过需要。

答案 1 :(得分:8)

这是对Scala最直接的翻译:

class ClassA{
  private var field1 = 1
  private var field2 = 2
}

请注意var而非val的使用情况。 val是一个不可变字段,对应于Java中的public final。因此,以后无法对其进行更改,并且提供一种将此类字段初始化为给定实例的正确值的方法非常重要。

为了决定你想要使用什么,你应该问自己Landei答案中列出的问题。

答案 2 :(得分:6)

两者之间最大的区别是类参数1可以用作构造函数。如果你想让构造函数没有参数,那么你需要使用第二个,再加上@Debilski建议的私有修饰符。

另一种选择是在构造函数中使用默认参数。这样,如果需要,可以更改字段:

class ClassA (private val field1: Int = 1, private val field2: Int = 2)

// Using defaults
val a = new ClassA

// Setting new values
val b = new ClassA(3, 4)

答案 3 :(得分:4)

如果您想拥有私人字段,为什么不将它们声明为私有字段?

class ClassA {
  private val field1: Int = 1
  private val field2: Int = 2
}

答案 4 :(得分:1)

如果总是希望field1和field2对于A类的每个实例都具有相同的值,我建议将它们放在一个配套模块中:

object A {
  private val field1 = 1
  private val field2 = 2
}

然后在A级使用它们:

class A {
  def complexInternalComputation = 2*A.a
}

或者这样:

class A {
  import A._
  def complexInternalComputation = 2*a
}