如何将以下Java构造函数代码转换为Scala?

如何将以下Java构造函数代码转换为Scala?,scala,Scala,我仍然在努力理解Scala构造函数 public class MyClass { private String myString = null; public MyClass() { myString = "hello"; } } 您的构造函数是默认构造函数,它不接受任何参数。这相当于不定义构造函数并将属性myString设置为hello。因为您将其定义为val,所以它是不可变的,没有与java setter等价的工具,但是您可以通过访问myStri

我仍然在努力理解Scala构造函数

public class MyClass {
    private String myString = null;

    public MyClass() {
        myString = "hello";
    }
} 

您的构造函数是默认构造函数,它不接受任何参数。这相当于不定义构造函数并将属性myString设置为hello。因为您将其定义为val,所以它是不可变的,没有与java setter等价的工具,但是您可以通过访问myString的值。符号,例如myClass.myString


您的构造函数是默认构造函数,它不接受任何参数。这相当于不定义构造函数并将属性myString设置为hello。因为您将其定义为val,所以它是不可变的,没有与java setter等价的工具,但是您可以通过访问myString的值。符号,例如myClass.myString


在Scala,你只需要

class MyClass {
  private var myString = "hello"
}
这看起来不一样,是吗?但是让我们看看字节码,看看Java代码实际产生了什么,让我们称之为类JavaConstructor:

我们看到它像人们希望的那样高效,并且反映了代码

然后问题是:为什么要像在Java中那样做?好吧,也许你有多个构造函数,其中一些会设置myString,而另一些不会!将其设置为null是一种提醒自己最好在使用它之前对其进行初始化的方法

但Scala不会让你这么做的。Scala实际上只允许一个构造函数;其他的只是调用一个构造函数的别名。如果需要,您可以将其设置为私有,并使用大量参数加载它,但关键是,拥有多个构造函数(其中一些设置关键数据,而另一些不设置关键数据)实际上是一个非常容易失败的过程。最好只写一次,然后写下

private var myString = if (someParameter) "hello" else null
如果你真的需要的话。再说一次,也许你只是把它变成了一个var,因为你试图在不同的构造函数中设置它。由于只有一个构造函数,可能不需要这样做:

private val myString = if (someParameter) "hello" else null
但也许现在它设置正确了,我们真的不需要它是私人的

val myString = if (someParameter) "hello" else null
如果经常没有设置,我们应该使用一个选项:

val myString = if (someParameter) Some("hello") else None

然后你会有一些看起来更像惯用Scala的东西。

在Scala中,你只需要这样做

class MyClass {
  private var myString = "hello"
}
这看起来不一样,是吗?但是让我们看看字节码,看看Java代码实际产生了什么,让我们称之为类JavaConstructor:

我们看到它像人们希望的那样高效,并且反映了代码

然后问题是:为什么要像在Java中那样做?好吧,也许你有多个构造函数,其中一些会设置myString,而另一些不会!将其设置为null是一种提醒自己最好在使用它之前对其进行初始化的方法

但Scala不会让你这么做的。Scala实际上只允许一个构造函数;其他的只是调用一个构造函数的别名。如果需要,您可以将其设置为私有,并使用大量参数加载它,但关键是,拥有多个构造函数(其中一些设置关键数据,而另一些不设置关键数据)实际上是一个非常容易失败的过程。最好只写一次,然后写下

private var myString = if (someParameter) "hello" else null
如果你真的需要的话。再说一次,也许你只是把它变成了一个var,因为你试图在不同的构造函数中设置它。由于只有一个构造函数,可能不需要这样做:

private val myString = if (someParameter) "hello" else null
但也许现在它设置正确了,我们真的不需要它是私人的

val myString = if (someParameter) "hello" else null
如果经常没有设置,我们应该使用一个选项:

val myString = if (someParameter) Some("hello") else None
然后你会有一些看起来更像惯用Scala的东西