我正在尝试将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"));
这不起作用。我该如何解决这个问题?
答案 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);
}
}