Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala构造函数再次使用局部变量_Scala - Fatal编程技术网

scala构造函数再次使用局部变量

scala构造函数再次使用局部变量,scala,Scala,我正在将我的java代码移植到scala,并且有一个构造函数可以做很多事情: 打开hibernate会话以加载数据 进行加载(现在会话保持打开状态!我需要进一步延迟加载) 对加载的数据执行一些操作并放入容器 将容器与其消费者捆绑在一起 ……诸如此类 闭门会议 构造函数生成相当多(~20)的对象成员,它们是final(scala中的val)。它们的创建不是独立的,还要注意会话。显然,我不希望会话和其他临时内容成为构造实例成员。在scala中如何做到这一点 以前也曾提出过类似的问题: 在前面

我正在将我的java代码移植到scala,并且有一个构造函数可以做很多事情:

  • 打开hibernate会话以加载数据
  • 进行加载(现在会话保持打开状态!我需要进一步延迟加载)
  • 对加载的数据执行一些操作并放入容器
  • 将容器与其消费者捆绑在一起
  • ……诸如此类
  • 闭门会议
  • 构造函数生成相当多(~20)的对象成员,它们是final(scala中的val)。它们的创建不是独立的,还要注意会话。显然,我不希望会话和其他临时内容成为构造实例成员。在scala中如何做到这一点

    以前也曾提出过类似的问题:

    在前面的主题中给出的答案建议要么从初始化方法返回一个包含~20个字段的元组,要么创建一个私有构造函数,将这些~20个值作为伴随对象应用方法的参数。在我看来,这两个都很难看


    到目前为止,最明智的方法似乎是将这些字段声明为VAR,而不是VAL,然后在一些初始化方法中重新分配它们,这也有点异味。

    我有一个技术上正确的解决方案,但它可能不是您想要的,因为它引入了大量的冗余

    trait Example {
      val a1 : Int
      val a2 : Int
      val a3 : Int
      val a4 : Int
      val a5 : Int
      val a6 : Int
    }
    object Example {
      def apply(seed : Int) : Example = {
        val x1 = seed + 1
        val x2 = x1 * 2
        val x3 = x2 / 3
        val x4 = x3 + x1
        val x5 = x4 * x2
        val x6 = x5 - x4
        new Example {
          override val a1 = x1
          override val a2 = x2
          override val a3 = x3
          override val a4 = x4
          override val a5 = x5
          override val a6 = x6
        }
      }
    }
    
    因此,没有构造函数,也没有初始化方法接受许多变量,但它们是通过trait extensing传递的。另一种(复杂的)方式是这样的:

    import Person.getParams
    
    class Person private (t: (Int, String, String)) {
        val a = t._1
        val b = t._2
        val c = t._3
    
      def this(filename: String) {
        this(getParams(filename))
      }
    }
    
    object Person {
      def getParams(filename: String): (Int, String, String) {
         // do some logic with filename which results in the relevant tuple
         // return the tuple
      }
    }
    

    当然,这仅限于22个参数,因此如果您需要更多,您将需要一个实际的类…

    我是否正确这与java代码相当:
    接口示例{int a1();int a2();}类示例工厂{public Example makeInstance(int seed){final int x1=seed+1;final int x2=x1*2;返回新示例(){int a1(){return x1;}int a2(){return x2;}}}}}
    PS愚蠢的注释格式我来到scala之前没有java方面的经验,但您的代码似乎相当粗糙。我认为这实际上是一个相当简洁的解决方案,可读性非常强,易于理解。