>

스칼라에서 팩토리 패턴/메소드를 구현하는 가장 좋은 방법은 무엇입니까?

우리는 그런 종류의 물건을 가지고 있습니다.

case class foo1(a:Int,b:String)
case class goo1(z:Double, w:String)

특성 등을 사용하여 일반적인 방법으로 작성하는 방법?

감사합니다

  • 답변 # 1

    목표가 즉시 인스턴스를 제공하는 자체 의존성 주입 모듈을 작성하는 것이 목표라면 기존 도구 중 일부를 찾아 보는 것이 좋습니다. "Scala 의존성 주입 프레임 워크"에 대한 간단한 Google 검색은 MacWire 와 같은 많은 결과를 산출합니다 Guice , ReaderMonad , cake pattern  등.

    그러나 내 판단은 당신의 동기와는 별개로 여기 질문에 간단히 대답하기 위해하나방법으로 스칼라에서 이것을 수행하는 방법도 안전합니다 :

    trait FactoryMethod[T] {
      type Args
      def defaultArgs: Args
      def withArgs(args: Args): T
      def default: T = withArgs(defaultArgs)
    }
    case class Foo(a:Int,b:String)
    object Foo {
      implicit object factory extends FactoryMethod[Foo] {
        override type Args = (Int,String)
        override def withArgs(args: Args): Foo = (Foo.apply _).tupled(args)
        override def defaultArgs: Args = (1,"foo")
      }
    }
    case class Goo(z:Double, w:String)
    object Goo {
      implicit object factory extends FactoryMethod[Goo] {
        override type Args = (Double,String)
        override def withArgs(args: Args): Goo = (Goo.apply _).tupled(args)
        override def defaultArgs: Args = (2L,"goo")
      }
    }
    object Factory {
      def of[T](implicit factory: FactoryMethod[T]): factory.Args => T = factory.withArgs
      def instanceOf[T](implicit factory: FactoryMethod[T]): T = factory.default
    }
    //obtain instance with default arguments
    Factory.instanceOf[Goo]
    //type safe way of obtaining instance with custom fed arguments
    Factory.of[Foo].apply((-22,"baz"))
    //By type safe I mean that the line below won't compile because the
    //arguments fed for Foo are not compatible:
    //Factory.of[Foo].apply(("bar","baz"))
    //Note that if you abstract over the types Goo and Foo like this:
    //def myMethod[T]: T = {
    //  Factory.instanceOf[T]
    //}
    //It won't compile unless you also ask for the needed implicit
    //on the method signature
    def myMethod[T: FactoryMethod]: T = {
      Factory.instanceOf[T]
    }
    
    

  • 이전 HDIV INVALID_PAGE_ID
  • 다음 c++ - 오류 - 상수 메모리를 사용할 때 잘못된 메모리 액세스가 발생했습니다