Vindo de um background OOP (Java), estou aprendendo Scala sozinho. Embora eu possa ver facilmente as vantagens de usar objetos imutáveis individualmente, estou tendo dificuldades para ver como é possível projetar um aplicativo inteiro como esse. Vou dar um exemplo:
Digamos que eu tenha objetos que representem "materiais" e suas propriedades (estou criando um jogo, então realmente tenho esse problema), como água e gelo. Eu teria um "gerente" que possui todas essas instâncias de materiais. Uma propriedade seria o ponto de congelamento e derretimento e o material para o qual congela ou derrete.
[EDIT] Todas as instâncias materiais são "singleton", como um Java Enum.
Quero que "água" diga que congela para "gelo" a 0 ° C e "gelo" para dizer que derrete para "água" a 1 ° C. Mas se água e gelo são imutáveis, eles não podem obter uma referência um para o outro como parâmetros construtores, porque um deles precisa ser criado primeiro e que não foi possível obter uma referência para o outro ainda não existente como parâmetro construtor. Eu poderia resolver isso fornecendo a ambos uma referência ao gerente, para que eles pudessem consultá-lo para encontrar a outra instância material de que precisam toda vez que forem solicitados por suas propriedades de congelamento / derretimento, mas então eu tenho o mesmo problema entre o gerente e os materiais, que eles precisam de uma referência um para o outro, mas só podem ser fornecidos no construtor para um deles, para que o gerente ou o material não possa ser imutável.
Não há maneira de contornar esse problema, ou preciso usar técnicas de programação "funcionais" ou algum outro padrão para resolvê-lo?
h2o
materiais