1

在 Scala 中,我需要在 Java 中执行以下代码:

public class A {
  private String text;  
  public A(String text) {
    this.text = text;
  }
}

如何在 Scala 中实现这一点?

我知道我可以使用class A(text: String) { ... },但这只是一个非常简化的示例,并非真实案例。

我尝试了以下方法,它始终打印为空:

class A {
  var text: String = null
  def this(text: String) = {
    this()
    this.text = text
  }
  println(text)
}

感谢帮助。

4

3 回答 3

6

在 Scala 中,类只有一个主构造函数,而它正是您这样定义的:class A(text: String) { ... }. 所有其他构造函数都应该首先调用它,然后再做自己的事情。

类主体中的所有表达式都被视为主构造函数的主体。所以println(text)在你的情况下是在主构造函数的主体中。你首先调用this()你的def this(text: String)构造函数,所以println被执行,然后你才初始化text字段。


从我的角度来看,主构造函数可以满足大多数现实生活中的用例(尤其是使用默认和命名参数)。那么您能否详细说明一下并解释为什么需要第二个?也许我们可以为您在那里面临的问题找到更好的解决方案。


关于评论的更新

如果您想在构建期间提供一组可选参数,那么我建议您使用Option而不是null值。所以你可以A像这样实现你的类:

class A(val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0)) 

new A(b = Some(10))

所有字段现在都是常量并具有一些默认值,但您可以自定义其中一些。例如,根据某些业务逻辑,某些参数组合也可能是互斥的。在这种情况下,使用多个构造函数是合理的。但更好的解决方案是在类的伴生对象中创建多个工厂方法并将构造函数设为私有。例如,如果允许该类的用户提供aandbc,那么您可以编写如下内容:

class A private (val a: Option[String] = None, val b: Option[Int] = None, c: Option[Double] = Some(2.0)) 

object A {
    def apply(a: String, b: Int) = new A(Some(a), Some(b))
    def apply(c: Double) = new A(c = Some(c))
}

A("test", 1)
A(11.1)
于 2013-01-29T11:07:03.000 回答
1
class A {
  var text: String = null
  def this(text: String) = {
    this()
    this.text = text
    println(text)
  }
}

或者

class A(text:String=""){
  println(text)
}

或者

class A(text:String=null){
  println(text)
}
于 2013-01-29T11:45:21.657 回答
0

正确的方法是:

    class A( text : String) {
       def this() = this("") // or null
   }

正如 Tenshi 所说,默认构造函数是 theA(text : String)和所有其他构造函数,例如this()必须首先调用它。

于 2013-01-29T11:16:40.490 回答