案例类别等于字节数组列表

Arc*_*ano 5 scala

我正在尝试在案例类上使用 should 匹配器

case class ListOfByteArrayCaseConfig(

  @BeanProperty 
  permissions: java.util.List[Array[Byte]]

)
Run Code Online (Sandbox Code Playgroud)

通过以下测试用例

val orig = ListOfByteArrayCaseConfig(List(Array[Byte](10, 20, 30)))
val orig2 = ListOfByteArrayCaseConfig(List(Array[Byte](10, 20, 30)))

orig2 should be === orig
Run Code Online (Sandbox Code Playgroud)

显然这会失败,因为两个字节数组在引用方面不相等。我想做的是以某种方式使这项工作在不更改测试用例代码的情况下仍然保留用例类。

有可能吗?(比如向案例类添加自定义 equals 方法?)

Arc*_*ano 2

我找到了解决方案。显然我可以重写案例类中的 equals 方法

Scala:忽略 equals/hascode 的 case class 字段?

尽管它首先消除了使用案例类的原因,即简化数据对象。

case class ListOfByteArrayCaseConfig(

  @BeanProperty 
  permissions: java.util.List[Array[Byte]]

) {

  override def equals(arg: Any): Boolean = {

    val obj = arg.asInstanceOf[ListOfByteArrayCaseConfig]
    var i: Int = 0
    for (i <- 0 until permissions.size()) {
      if (!util.Arrays.equals(permissions.get(i), obj.permissions.get(i))) {
        return false
      }
    }
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但您不应该假设传递给 `equals()` 的对象是 `ListOfByteArrayCaseConfig` 类型。此外,考虑使用模式匹配而不是向下转型。 (4认同)
  • 如果您计划将其与集合或映射一起使用(或者只是希望“hashCode”和“equals”保持一致),您最好也覆盖“hashCode”。 (2认同)