2017-03-17 5 views
0

GroovyからScalaへの移行、およびこれまでのScalaの愛用。私がGroovyについて深く忘れていることの1つは、オブジェクトのプロパティ/フィールドを定義し、他のクラスのゲッターを使わずに参照できるという事実です。 Javaで例えばgetterを使用しないScalaフィールドへのアクセス

、:

public class Fizz { 
    private String buzz; 

    public Fizz(String buzz) { 
     super(); 

     setBuzz(buzz); 
    } 

    // Getters and setters for buzz 
} 

しかしGroovyで:

class Fizz { 
    String buzz 
} 

その後、私はそうのような別のクラスからbuzzを参照することができます:それはそうしかし

void someMethod(Fizz fizz) { 
    if(fizz.buzz == "gnarly!") { 
     ... 
    } 
} 

Scalaはこのように振る舞いません。あなたはこのために解決しなければなりません:

class Fizz(buzz : String) { 
    ... 
} 

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.getBuzz.eq("gnarly!")) { 
    ... 
    } 
} 

(この1つのユースケースのために)私のScalaのコード「Groovier」を作るために、私はScalaのクラスのいくつかの内部の「ヘルパー」メソッドを追加することに決めました:

今ことができます
class Fizz(buzz : String) { 
    def buzz() : String = { this.buzz } 
} 

私はそうのようにそれらにアクセスするには:

def someMethod(fizz : Fizz) : Unit = { 
    if(fizz.buzz.eq("gnarly!")) { 
    ... 
    } 
} 

私の質問:んScalaは私が上記の目的の動作を達成することを可能にする任意の他のメカニズム/デバイスを持っているwithou私のいわゆる「ヘルパーメソッド」を書く必要はありませんか?

+1

Scalaのケースクラスについてお読みください –

+0

なぜこれがダウンリストされたのか分かりません。これは話題になっています。詐欺師ではありません(私はScalaにとっては初めてのことであり、これまでにこのサイトで質問されたケースクラスやその他の構造物については知らないかもしれません) SSCCE](http://sscce.org)。 – smeeb

答えて

3

実際にはあります。このniceの例を見てください。プライマリコンストラクタでパラメータを宣言する方法に応じて、次のような動作が発生します。

宣言ゲッター?セッター?
----------- ------- -------
VARはいはい
ヴァルここでノーノー

はいいいえ
デフォルト、 defaultは、実際に行うように、valまたはvarのいずれも含まないクラス・パラメータを宣言することを意味します。その結果、valを手前に置くだけで、すぐにフィールドにパブリックアクセスできます。

私はこれが役に立ちそうです。

+0

@Bianca Tesilaありがとうございますが、フィールド参照の前に 'get'をつける必要はありませんか?だから 'fizz.getBuzz'?私は 'fizz.buzz'と書くだけの方法を探しています。 – smeeb

+0

いいえ、 'fizz.buzz'を呼び出すと、実際に内部で作成されたゲッターが呼び出されます。だからあなたはそれに加えて何も必要ない。 javapツールを使って何が生成されているかを確認することができます。 –

関連する問題