2016-12-12 8 views
4

Я пытаюсь определить один класс case с 1000 полями в scala REPL 2.11.8. Определение класса корпуса выглядит так:scala case class too many fields

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 не поддерживает такой случай? Есть ли какие-нибудь работы?

+5

Зачем вам нужен класс с 1000 полями? – Pavel

+0

Если поля называются 'D1'' 'D1000', почему бы не использовать массив? – Thomas

+1

Вы решили сделать это вместо этого: 'case class Step2_Class (response: String, theDs: List [String])'? – marstran

ответ

6

Похоже, что ошибка не связана с количеством полей.

Вы сказали, что через некоторое время перерыв. Вы уверены, что у вас нет рекурсивной функции без условия возврата? Ошибка StackOverFlow является ошибкой во время выполнения.

Брошенный, когда переполнение стека происходит потому, что приложение рекурсивно слишком глубоко.

Если проблема связана с количеством полей, она появляется во время компиляции.

Хотя проблема не связана с количеством полей, это очень плохая идея создать код с 1000 параметрами или класс с 1000 полями. Как вы можете себе представить, нет никакой реальной разницы между D1 и D15 и D1000, поэтому почему бы не использовать массив под названием D?

+1

Вам не хватает того, что компилятор _itself_ может вызывать исключение во время выполнения, включая 'StackOverflowError', и судить из' scala.reflect.internal.Trees' в стеке trace, вот что происходит (макро-вызов также может привести к такому). –

1

До недавнего времени в классе корпуса был предел 22 полей. Поэтому неудивительно, что компилятор (или сам REPL) не может изящно обрабатывать 1000 полей. Вы можете попытаться предоставить ему больше памяти (и, в частности, стеке в частности), установив JAVA_OPTS (-Xss для переполнения стека, в частности), например.

JAVA_OPTS="$JAVA_OPTS -Xss8M" scala 

, но вы должны угадать, сколько, это не помогло бы значительно со скоростью (если это не в основном застрял мусор сбора, что вполне возможно), и это может произойти сбой с более полей.