2011-01-31 40 views
12

如何将以下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

这两个版本都不相同,因为这两个字段在Java版本中都是私有的,并且在您展示的Scala替代品中是公共的。也许你会更关心你想要达到的目标吗? – 2011-01-31 16:58:15

回答

4

如果你想拥有私人领域,为什么不宣布他们是私人的?

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

两者之间最大的区别是类参数one可以用作构造函数。如果你希望构造函数没有参数,就像你的Java示例一样,那么你需要使用第二个参数,再加上@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) 
+0

这是一个很好的解决方案,但不等同于OP的Java代码。 – Raphael 2011-01-31 12:13:56

+0

@Raphael的确如此。但是,由于给出的Java示例本身似乎毫无意义,我认为可能显示一些选项可能很有趣:) – eivindw 2011-02-02 07:36:52

1

如果总是希望该字段1和字段2对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 
} 
+0

这不起作用; `A.a`不能从类`A`的实例访问,因为它是私有的。 – Raphael 2011-01-31 12:12:53

16

有没有简单的翻译从Java到斯卡拉,这取决于上下文:

  • 在Java可变的变量?如果是的话(否则它们应该是Java中的final):在Scala中使它们不变是否有意义?
  • 构造函数应该在Scala中保持公开吗?会是一个工厂(例如 伴侣对象中的应用方法)更合适吗?
  • 为什么都是变量private?他们有吸气剂和/或吸附剂吗?
  • 什么时候需要变量,是否有意义使他们懒惰?
  • 如果这些值是不可变的并且暴露出来,它们会在模式匹配中有用吗?案例课是否是正确的选择?
  • 是否可以将变量分组(例如,在一个元组中)以简化API和访问?

你看,有这么多的考虑。我建议您了解Scala的可能性,并尝试不同的方法,否则您会陷入“Scala更好的Java”陷阱中,而且会比需要的时间更长。

8

这是最直接的翻译斯卡拉:

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

var代替val使用。 val是一个不可变的字段,对应于Java中的public final。因此它不能在以后改变,并且为给定实例提供一种将这样的字段初始化为正确值的方式是重要的。

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