2
votes

Lequel parmi l'importation d'objet compagnon ou l'extension de trait est meilleur

J'ai un protocole JSON écrit en spray

trait MyJsonProtocol {
   //some logic
}

object MyJsonProtocol extends MyJsonProtocol {

}

Maintenant, quel est le meilleur ?? Importer cet objet compagnon ou étendre le trait?


2 commentaires

Les deux vont bien.


Ce n'est pas une question d'opinion, mais un cas d'utilisation spécifique où il existe des différences techniques claires entre les deux solutions.


3 Réponses :


0
votes

Cela dépend du scénario, car une classe ou un objet compagnon peut accéder aux membres privés de son compagnon. Utilisez un objet compagnon pour les méthodes et les valeurs qui ne sont pas spécifiques aux instances de la classe compagnon. Si vous voulez simplement l'héritage multiple mais autorisez la réutilisation du code, le trait est très bien.

J'espère que cela aide.


0 commentaires

3
votes

Si vous créez des instances JsonFormat pour spray, vous pouvez simplement créer un objet directement et importer cela. Cela signifie que vous n'avez qu'une seule instance de vos valeurs et objets implicites.

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit object MyTypeJsonFormat extends RootJsonFormat[MyType] {
    def write(v: MyType): JsValue = ...
    def read(value: JsValue): MyType = ...
  }

  implicit val myClassFormat = jsonFormat5(MyClass)
}

class OtherClass {
  import MyJsonProtocol._

  ...
}


0 commentaires

0
votes

Cela dépend de votre logique. Si vous définissez des implicits, l'importation d'un objet et l'extension d'un trait sont différentes. Si vous importez, vous définissez des implicits de même priorité que les implicites locaux. Si vous étendez, vous créez des implicits de faible priorité par rapport aux implicites locaux.


2 commentaires

Cela ne ferait une différence que si le protocole a une implémentation conflictuelle de JsonFormat , ce qui semble très improbable.


La logique peut ne pas être si primitive. Il peut y avoir des instances définies de manière inductive.