scala case类太多字段

时间:2016-12-12 08:27:58

标签: java scala

我试图在scala REPL 2.11.8中定义一个包含1000个字段的case类。案例类定义如下:

case class Step2_Class(
   `Response` : String,
   `D1` : String,
   `D2` : String,
   `D3` : String,
   `D4` : String,
    //......,
   `D999` : String,
   `D1000` : String)

REPL正在等待回复。大约1小时后,抛出了堆栈溢出异常。

java.lang.StackOverflowError
    at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1294)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
    at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:288)
    at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:282)
    at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1283)
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)

你有什么想法吗? scala不支持这种情况吗?有没有解决方法?

2 个答案:

答案 0 :(得分:6)

似乎错误与字段数无关。

你说过了一段时间它就破了。如果没有返回条件,您确定没有递归函数吗? StackOverFlow infact是运行时错误。

  

当发生堆栈溢出时抛出,因为应用程序过于粗暴

如果问题与编译时出现的字段数有关。

虽然问题与字段数无关,但创建包含1000个参数的代码或包含1000个字段的类是一个非常糟糕的主意。你可以想象D1和D15和D1000之间没有真正的区别,为什么不使用一个名为D的数组?

答案 1 :(得分:1)

直到最近,案例类别限制了22个字段。因此,如果编译器(或REPL本身)无法正常处理1000个字段,那就不足为奇了。您可以尝试通过设置JAVA_OPTS(特别是堆栈溢出为-Xss)来为其提供更多内存(特别是堆栈内存),例如。

JAVA_OPTS="$JAVA_OPTS -Xss8M" scala

但你必须猜测多少,它对速度没有多大帮助(除非它主要是垃圾收集,这很可能),并且它可能会因为更多的字段而失败