Java类中的Scala setter和getter

时间:2016-01-08 19:43:56

标签: java scala

我正在尝试将Java中的混合Scala / Java项目逐个转换为Scala。我有一个带有一堆Scala setter和getter的课程。这是一个例子:

class inputParams {
  var _lakeHdfsPath: String = _
  var mandatoryParams = ArrayBuffer[String]()
  def lakeHdfsPath = this._lakeHdfsPath

  def lakeHdfsPath_=(_lakeHdfsPath: String) = {
    mandatoryParams -= "lakeHdfsPath"
    this._lakeHdfsPath = _lakeHdfsPath
  }
  ...

在我的Java类中,我试图设置这个对象,但遇到了困难:

retVal.lakeHdfsPath(cliOpts.getOptionValue("lakeHdfsPath"));

因为在Scala中它需要:

retVal.lakeHdfsPath = cliOpts.getOptionValue("lakeHdfsPath")

但是在Java中:

retVal.lakeHdfsPath() = (cliOpts.getOptionValue("lakeHdfsPath"));

这不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

在Scala中,你应尽可能偏离可变状态。对于bean,您应该将它们实现为案例类。你会自动获得setter和getter。

case class inputParams (lakeHdfsPath: String) {
  def withLakeHdfsPath(newLakeHdfsPath: String): inputParams = 
    copy(lakeHdfsPath = newLakeHdfsPath)
}

在这里,您只需要用于java兼容性的withLakeHdfsPath方法,可以在Scala中访问复制方法。

答案 1 :(得分:0)

也许您可以更改Scala代码中的setter并省略def(=)中的equals:

def lakePath_(_lakePath: String): Unit = {
        mandatoryParams -= "lakePath"
        this._lakePath = _lakePath
      }

还定义了getter的返回值:

   var _lakePath: String = _
      def lakePath(): String = this._lakePath

然后在java代码上尝试getter和setter:

    public class Main {
        public static void main(String[] args) {

            //Instantiate the InputParams class.
            InputParams returnVal = new InputParams();

            //Setting _lakePath.
            returnVal.lakePath_("lakePath");

            //Getting _lakePath.
            String _lakePath = returnVal.lakePath();
            //Printing _lakePath to console.
            System.out.println(_lakePath);
        }
}