У меня есть обычный класс Scala, который я хочу реорганизовать, чтобы он стал неизменяемым классом case. Поскольку мне нужно, чтобы класс хорошо вел себя в Set
операциях, я хочу, чтобы все методы, автоматически сгенерированные компилятором Scala, предоставлялись для класса case. IOW, я хочу избежать написания этих различных методов; equals
, hashCode
, toString
и т. Д., Поскольку это очень подвержено ошибкам. И мне нужно сделать это для множества классов, поэтому мне нужно общее решение, а не просто конкретное решение аномального быстрого исправления или взлома.
Вот класс, с которым я работаю:
class Node(val identity: String, childrenArg: List[Node], customNodeArg: CustomNode) {
val children: List[Node] = childrenArg
val customNode: CustomNode = customNodeArg
}
Как видите, конструктор класса имеет три параметра. Первый, identity
, доступен только для чтения. Остальные два, childrenArg
и customNodeArg
, являются обычными параметрами метода; т.е. они присутствуют только во время создания экземпляра, а затем полностью исчезают из экземпляра класса (если иное не зафиксировано) по завершении выполнения конструктора класса.
Моя первая наивная попытка преобразовать это в неизменяемый класс case была следующая (просто удалив val
из первого параметра):
class Node(identity: String, childrenArg: List[Node], customNodeArg: CustomNode) {
val children: List[Node] = childrenArg
val customNode: CustomNode = customNodeArg
}
Однако это привело к нежелательному эффекту от того, что оба параметра childrenArg
и customNodeArg
теперь были повышены, чтобы стать (доступными только для чтения) свойствами (вместо того, чтобы оставить их как обычные параметры метода). И это имело еще один нежелательный эффект - они были включены в составленные компилятором реализации equals
и hashCode
.
Как пометить неизменяемые параметры конструктора класса case childrenArg
и customNodeArg
так, чтобы identity
было единственным свойством класса case, доступным только для чтения?
Любые указания по этому поводу; ответы, ссылки на обсуждения на веб-сайте и т. д. приветствуются.