如何将以下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
}
建议什么,为什么?
答案 0 :(得分:18)
没有从Java到Scala的简单转换,它取决于上下文:
你知道,有很多考虑因素。我建议学习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
}