Scala构造函数重载参数不生效

Scala constructor overloading parameter is not taking effect

我试图了解我实现构造函数重载的方式有什么问题。我想在具有同名成员的 class 中添加一个接受参数 count 的构造函数。

想法是 count 根据默认构造函数参数之一进行计算,除非它通过重载构造函数传递。我稍后展示代码。

为了说服自己这可行,我构建了一个快速简单的测试:

import org.scalatest.FunSuite

class ConstructorOverloadTest extends FunSuite {

  test("Overload parameter shadows class member") {
    val actual = new TestME(200).length

    200 === actual
    1 !==  actual
  }

  class TestME(name:String) {
    val length = name.length

    def this(length:Int) = {
      this("*")
    }
  }
}

测试按预期通过。这让我明白重载构造函数参数 length shadows/replaces class 成员 length.

但是当我在另一个 class 中执行相同操作时,class 成员不是 shadowed/replaced。

class MyClass(input1: Array[Float], input2: Array[Byte], input3: Array[Float]) {

  val count = input2.length

  val index = doSomething()

  def this(count: Int) = {
    this(Array(), Array(), Array())
  }


  def printCount() = {
    if (this.count == 0)
      println("ZERO")
    else
      println("OTHER")
  }
}

当我使用这个class如下

val myInstance = new MyClass(200)
myInstance.printCount()

我希望它能在屏幕上打印 OTHER。相反,它打印 ZERO.

为什么?

您的测试似乎有问题。 new TestME(200).length returns 1,说明构造参数实际上并没有覆盖length.

class TestME(name:String) {
  val length = name.length

  def this(length:Int) = {
    this("*")
  }
}

println(new TestME(200).length)
1

根据 summerbulb 的评论:

  1. 测试的断言应该包含在 assert:

    // Closer to correct...
    assert(200 === actual)
    assert(1 !==  actual)
    
  2. 应按以下顺序传递实际值和预期值:

    // Correct!
    assert(actual === 200)
    assert(actual !== 1)