Предположим, мы имеем следующие классы случай:Кэширование Scala Case Класс Экземпляры
abstract sealed class Tree
case class Leaf(i: Int) extends Tree
case class Node(left: Tree, right: Tree) extends Tree
Каждый раз, когда мы называем случай конструктор класса, новый объект создается в памяти. Например, в коде ниже:
val a = Leaf(0)
val b = Leaf(0)
а и б точки к различным объектам в памяти:
a == b // true
a eq b // false
Я хотел бы переопределить метод «применить» классов дела, чтобы сделать их верните кешированный объект, если он уже существует, так что в минимальном примере выше «a e b b» вернет true.
Я нашел эти две связанные ответы в Stackoverflow:
How to override apply in a case class companion (показывает, как переопределить "применить" метод)
Why do each new instance of case classes evaluate lazy vals again in Scala? (показан простой способ кэширования экземпляров случай класса)
Я планирую реализовать свой переопределяющий метод «apply» с кешированием таким образом, который объединяет два подхода, связанных с abo ве. Но мне интересно, есть ли альтернативные способы, которые я должен рассмотреть. Если вы знаете, можете ли вы поделиться своим решением здесь?
Кэширование экземпляров классов случаев представляется очень полезным и естественным, чтобы уменьшить потребление памяти. И тем не менее, решение, которое я планирую реализовать (на основе двух ответов, приведенных выше), кажется довольно запутанным, требуя большого кода шаблона, который будет нарушать элегантность и лаконичность классов дел. Кто-нибудь знает, если будущие версии языка Scala может позволить нам достичь кэширования экземпляра класса случай, написав что-то простое, как это:
abstract sealed class Tree
cached case class Leaf(i: Int) extends Tree
cached case class Node(left: Tree, right: Tree) extends Tree
??
Просто случайный вопрос, вы видели это «кеширование» в качестве основной функции на любом другом языке? По крайней мере, я еще не сталкивался с этим. –
Я тоже. И это заставляет меня задаться вопросом, есть ли причины для этого. @ Ответ Алексея Романова ниже указывает на некоторые интересные причины. – Bruno