Отражение Scala на объекте

#scala

#scala

Вопрос:

Если у меня есть следующий объект scala:

 object CustomerState {
   val PENDING = "pending"
   val TRIAL = "trial"
   val PAYING = "paying"
   val DEACTIVATED_TRIAL = "deactivated_trial"
   val DEACTIVATED_PAYING = "deactivated_paying"
}
 

Как я могу получить список всех значений val? В этом случае я ищу, чтобы получить список («ожидающий», «пробный», «оплата», «деактивированный_trial», «деактивированный_paying»)

Заранее спасибо, Тодд

Ответ №1:

На данный момент я думаю, что лучшее, что вы можете сделать, это получить список всех методов с нулевым аргументом (поскольку для этого val компилируются s) и вызвать их:

 CustomerState.getClass.getMethods.toList.filter(_.getParameterTypes.isEmpty).map(_.invoke(CustomerState))
 

В версии 2.10 будет библиотека отражения, специфичная для Scala, которая улучшит ситуацию.

Ответ №2:

Разве вы не должны использовать Enumeration ?

Пример:

 object Main extends Application {

   object CustomerState extends Enumeration {
     type CustomerState = Value
     val Pending, Trial, Paying, Deactivated = Value
   }

   import CustomerState._

   CustomerState.values foreach println // Will print each value
 }
 

Комментарии:

1. Я думал, что преобладающая мудрость заключалась в том, что перечисление Scala было отклонением, которого лучше избегать.

2. Я нахожусь под тем же впечатлением от использования перечисления в scala

3. Я буду использовать перечисления вместо отражения в любой день недели.

4. Эти объекты используются с классами Salat case, так что это не так просто