簡體   English   中英

Java類中的Scala設置程序和獲取程序

[英]Scala setters and getters in a Java class

我試圖將Java的Scala / Java混合項目逐步地從Java轉換為Scala。 我有一堂課,上面有很多Scala的設置方法和獲取方法。 這是一個例子:

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"));

那是行不通的。 我該如何解決?

在Scala中,您應該盡可能遠離可變狀態。 對於bean,您應該將它們實現為case類。 您會自動獲取設置者和獲取者。

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

在這里,您僅需要withLakeHdfsPath方法即可實現Java兼容性,在Scala中可以訪問copy方法。

也許您可以在Scala代碼中更改setter並在def(=)中忽略等號:

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);
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM