3 votes

Immutabilité Scala dans le stockage persistant avec Squeryl

Alors que je suis en train de lire le Jouer pour Scala livre, je suis tombé sur quelque chose de bizarre qui était expliqué dans le livre. Voici le passage en question :

Il y a quelque chose d'étrange qui se passe, cependant. Si vous utilisez des classes immuables immuables - ce qui est le cas des classes de vanille - vous pourriez être inquiet lorsque vous découvrez que Squeryl met à jour le champ id de votre objet, supposé immuable. de votre objet lorsque vous insérez l'objet. Cela signifie que si vous exécutez la commande code suivant,

val myImmutableObject = Product(0, 5010255079763,
  "plastic coated blue", "standard paperclip, coated with blue plastic")
Database.productsTable.insert(myImmutableObject)
println(myImmutableObject)

le résultat sera, contre toute attente, quelque chose comme : Product(13, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic") . Cela peut conduire à de mauvaises situations si le reste de votre code s'attend à ce qu'une instance de l'une de vos classes de modèle ne change jamais. Afin de vous protéger de ce genre de situation, nous vous recommandons de changer les méthodes d'insertion que nous vous avons montrées plus tôt en ceci :

def insert(product: Product): Product = inTransaction {
    val defensiveCopy = product.copy
    productsTable.insert(defensiveCopy)
}

Ma question est la suivante : étant donné que la classe de produit est définie comme suit :

import org.squeryl.KeyedEntity

case class Product(
    id: Long,
    ean: Long,
    name: String,
    description: String) extends KeyedEntity[Long]

Database est défini comme suit :

import org.squeryl.Schema
import org.squeryl.PrimitiveTypeMode._
object Database extends Schema {
    val productsTable = table[Product]("products")
    ...

    on(productsTable) { p => declare {
        p.id is(autoIncremented)
    }}
}

Comment alors est-il possible qu'une classe de cas déclarée en tant que val peut avoir un de ses champs modifiés ? Squeryl utilise-t-il une sorte de réflexion pour modifier le champ ou le livre fait-il une erreur ?

Je ne suis pas en mesure d'exécuter les exemples pour vérifier ce que le cas pourrait être, mais quelqu'un qui a utilisé Squeryl peut peut-être donner une réponse ?

0voto

Sonny Points 1

Vous pouvez vérifier la définition de table pour vous-même :

https://github.com/squeryl/squeryl/blob/master/src/main/scala/org/squeryl/Schema.scala#L345

Il s'agit d'une fonction générique qui utilise la réflexion pour instancier l'objet Table lié à la classe de cas donnée. Les fonctions sont des citoyens de première classe en Scala, elles peuvent donc être assignées à une val comme n'importe quoi d'autre.

Le dernier fragment est également une fonction asynchrone, qui fait correspondre un argument donné à une modification définie pour lui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X