2017-03-17 222 views
0

从Groovy迁移到Scala以及到目前为止爱Scala。我对Groovy深感遗憾的事情之一是,我可以在对象上定义属性/字段,然后仅仅引用它们而不用其他类的getter。在没有获取者的情况下访问Scala字段

例如,在Java:

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!") { 
     ... 
    } 
} 

但是似乎斯卡拉不这样做,你必须解决这个问题:

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

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

为了使我的Scala代码“更巧妙”(这一个用例)我在里面加入一些我的Scala类的“帮手”的方法解决:

class Fizz(buzz : String) { 
    def buzz() : String = { this.buzz } 
} 

现在允许我访问他们像这样:

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

我的问题:斯卡拉是否有任何其他机制/设备,让我来完成上述所需的行为withou不得不写我所谓的“帮手方法”?

+1

请阅读斯卡拉案例类 –

+0

不知道为什么这是downvoted。这是关于主题,不是一个骗局(鉴于我显然是新来的Scala,可能不知道事情类案例或其他构造已经在此网站上查询过),显示研究,是一个[ SSCCE](http://sscce.org)。 – smeeb

回答

3

其实,它的确如此。看看这个nice的例子。根据您如何在主构造函数中声明参数,您会得到以下行为:

声明Getter?二传手?
----------- ------- -------
VAR是是
VAL是没有
默认无无

这里, default表示您按照实际情况声明不带valvar的类参数。因此,只需将val放在它的前面,您就可以公开访问开箱即用的字段。

我希望这是有帮助的。

+0

谢谢@Bianca Tesila,但是这并不需要我在get参数前添加字段引用?那么'fizz.getBuzz'?我正在寻找一种方法来写'fizz.buzz'。 – smeeb

+0

不,当你调用'fizz.buzz'时,你实际上调用了内部创建的getter。所以除此之外你不需要任何东西。您可以检查使用javap工具生成的内容。 –

相关问题