Scala实例变量的最佳实践

hal*_*arp 15 scala

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

class ClassA {
    private int field1;
    private int field2;

    public ClassA() {
        field1 = 1;
        field2 = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以看到两个选项:

class ClassA(val field1: Int, val field2: Int) {
   ....
}
Run Code Online (Sandbox Code Playgroud)

要么

class ClassA {
   val field1: Int = 1
   val field2: Int = 2
}
Run Code Online (Sandbox Code Playgroud)

推荐什么,为什么?

Lan*_*dei 18

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

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

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


zig*_*tar 8

这是对Scala最直接的翻译:

class ClassA{
  private var field1 = 1
  private var field2 = 2
}
Run Code Online (Sandbox Code Playgroud)

注意使用var而不是val.val是一个不可变字段,对应public final于Java.因此,以后不能对其进行更改,并且提供将这样的字段初始化为给定实例的正确值的方法很重要.

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


eiv*_*ndw 6

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

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

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)
Run Code Online (Sandbox Code Playgroud)


Deb*_*ski 5

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

class ClassA {
  private val field1: Int = 1
  private val field2: Int = 2
}
Run Code Online (Sandbox Code Playgroud)