Scala: общедоступный статический финал в классе

В мире.NET большинство платформ МОК обеспечивает и XML и конфигурацию Кода.

StructureMap и Ninject, например, используют быстрые интерфейсы для конфигурирования контейнеров. Вы больше не вынуждаетесь использовать конфигурационные XML-файлы. Spring, который также существует в.NET, в большой степени полагается на XML-файлы, так как это - его исторический основной интерфейс конфигурирования, но все еще возможно настроить контейнеры программно.

9
задан Tom 21 December 2017 в 00:11
поделиться

3 ответа

Следующий код 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 работать с нестатическими методами генерации параметров.

3
ответ дан 4 December 2019 в 12:19
поделиться
object Foo{
  val MY_STRINGS=Array("A","B","C")
}
class Foo{
  import Foo.MY_STRINGS
}

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

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

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

11
ответ дан 4 December 2019 в 12:19
поделиться

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

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

1
ответ дан 4 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: