2016-11-04 6 views
1

Ich möchte Informationen eines geöffneten Projekts in einem webbasierten Projekt speichern, das CSV-ähnliche Daten anzeigt.scala: Fallklasse und wie organisiert man

Ich habe

case class Project(user:String, sessionId : String, fileOpen : String, commands:ArrayBuffer[Command]) 

Frage: werden Befehle, die verschiedene Elemente ändern, um die Bedeutung des Gleichheits beeinflussen?

Wenn ich will nicht Befehle an equals und Hash-Code nehmen und wollen nicht zu, diese Methoden reiten auf über, kann ich Befehle nach der Klassendeklaration erklären:

case class Project(user:String, sessionId : String, fileOpen : String) ...{ 
    val commands:ArrayBuffer[Command] 

Jede andere Art und Weise zu dem Compiler mitteilen, ihn nicht in den equals und hascode zu verwenden?

Antwort

1

überschreiben equals, um nur die erforderlichen Felder für Gleichheitsprüfungs- und Ignorierbefehle zu vergleichen.

Verwenden Sie nicht ArrayBuffer stattdessen unveränderliche Lösung.

Wenn Sie Befehle Instanz zu einer exisiting Projekt möge hinzufügen copy verwenden zu tun, dass

val newProject = project.copy(commands = Command("ls") :: project.commands) 

vorausgesetzt Befehl wie diese case class Command(name: String)

Zwingende equals und hashCode erklärt

case class Project(user:String, sessionId : String, fileOpen : String, commands: List[Command]) { 
    override def equals(obj: scala.Any): Boolean = obj match { 
    case obj: Project => this.user == obj.user && this.sessionId == obj.sessionId && this.fileOpen == obj.fileOpen 
    case _ => false 
    } 
    override def hashCode(): Int = 1013 * user.hashCode + 1009 * sessionId.hashCode + 1003 * fileOpen.hashCode 
}