Scala: публичный статический финал в классе - PullRequest
9 голосов
/ 27 октября 2009

Я пытаюсь получить реальный эквивалент для Java public static final в Scala для использования TwiP .

Создание val в object не работает для меня, потому что это часть нового сгенерированного класса Example$.class, и TwiP не может получить к нему доступ из класса Example.class.

Вот пример класса Java, который я пытаюсь перенести в Scala:

public static final String[] MY_STRINGS = { "A", "B", "C" };

@Test
public void myTest(@Values("MY_STRINGS") String string) {
  ...
}

Но я не знаю, как перенести public static final в Scala. Если это значение в объекте, как здесь

@RunWith(classOf[TwiP])
class Foo {

  import Foo.MY_STRINGS

  @Test
  def testTwiP(@Values("MY_STRINGS") value: String): Unit = {
    println("I'm testing value " + value + ".")
  }

}

object Foo {
  val MY_STRINGS = Array("A", "B", "C")
}

Я получаю только следующее исключение:

net.sf.twip.internal.TwipConfigurationError:
there is no method or field 'MY_STRINGS' named in the @Values annotation of Parameter#1

Как решить проблему с помощью Scala?

Ответы [ 4 ]

11 голосов
/ 28 октября 2009
object Foo{
  val MY_STRINGS=Array("A","B","C")
}
class Foo{
  import Foo.MY_STRINGS
}

Определение val в сопутствующем объекте создает вашу переменную public static final, а объявление import дает ей хороший простой псевдоним в коде, который вы используете для написания класса.

Обратите внимание, что переменная public static final в Scala все равно будет компилироваться, чтобы выглядеть как статический вызов метода, если вы вызываете этот код из Java.

Редактировать: Я немного ошибаюсь из-за ошибки в Scala 2.7, которую я подробно продемонстрировал в другом ответе.

3 голосов
/ 30 октября 2009

Следующий код Scala:

class Foo{
  import Bar.MY_STRINGS
}
object Bar{
  val MY_STRINGS=Array("A","B","C")
}

Создает следующие классы Java:

public final class Bar extends java.lang.Object{
    public static final java.lang.String[] MY_STRINGS();
    public static final int $tag()       throws java.rmi.RemoteException;
}
public final class Bar$ extends java.lang.Object implements scala.ScalaObject{
    public static final Bar$ MODULE$;
    public static {};
    public Bar$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}
public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}

Следующий код Scala:

class Foo{
  import Foo.MY_STRINGS
}
object Foo{
  val MY_STRINGS=Array("A","B","C")
}

Создает следующие классы Java:

public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}
public final class Foo$ extends java.lang.Object implements scala.ScalaObject{
    public static final Foo$ MODULE$;
    public static {};
    public Foo$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}

Тот факт, что статические члены не определены в классе, когда объект имеет то же имя, что и класс, является Ошибка Scala # 1735 и исправлена ​​в снимках Scala 2.8.

Похоже, что TwiP вообще не будет работать, если вы не обновите Scala или не найдете способ заставить TwiP работать с нестатическими методами генерации параметров.

2 голосов
/ 19 июня 2017

Вы просто должны определить переменную как "val" в сопутствующем объекте.

object Foo{
  val MyStrings = Array("A","B","C")
}

ПРИМЕЧАНИЕ: конечные статические переменные в scala не следуют тому же соглашению, что и в Java. Взгляни на: http://docs.scala -lang.org / стиль / именовании-conventions.html

1 голос
/ 27 октября 2009

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

Возможно, это не лучший подход, но было бы полезно, если бы вы могли объяснить, почему вы хотите использовать public static final для переменной, поскольку лучшее решение может быть более очевидным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...