2011-01-31 52 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的答案中列出的問題。