Java, который, как гарантируют, будет встраивать строковые константы, если они могут быть определены во время компиляции

Существует также инструмент PHP UML, доступный от груша .

PHP_UML:

  • Может генерировать файлы UML/XMI в версии 1.4, или в версии 2.1 (логичный, компонента, и представления развертывания)
  • Может генерировать документацию API в формате
  • HTML, Может сгенерировать код PHP (скелет кода) из данного файла
  • XMI Может преобразовать содержание UML/XMI от версии 1.4 до Установки версии 2.1

это на командной строке через:

$ pear install pear/php_uml

(Это раньше было $ pear install pear/php_uml-alpha, но пакет с тех пор пошел стабильный.)

Генерируют Ваш xmi:

$ phpuml -o project.xmi

18
задан Yishai 10 September 2009 в 17:44
поделиться

6 ответов

Это гарантированно будет обрабатываться как постоянное выражение и гарантированно интернировано раздел 15.28 JLS :

A compile- выражение постоянной времени выражение, обозначающее значение примитивный тип или String, не завершен резко и составлен используя только следующее:

  • Литералы примитивного типа и литералы типа String (§3.10.5)
  • Преобразование в примитивные типы и преобразование в тип String
  • Унарные операторы +, -, ~ и! (но не ++ или -)
  • Мультипликативные операторы *, / и%
  • Аддитивные операторы + и -
  • ...

...

Константы времени компиляции тип String всегда "интернированы", чтобы делиться уникальные экземпляры, используя метод String.intern.

Это еще не значит, что он гарантированно будет встроен. Однако в разделе 13.1 спецификации говорится:

Ссылки на постоянные поля. переменные (§4.12.4) разрешаются в время компиляции до постоянного значения что обозначено. Никаких ссылок на такие постоянное поле должно присутствовать в код в двоичном файле (кроме класс или интерфейс, содержащий постоянное поле, которое будет иметь код для его инициализации), и такая константа поля всегда должны казаться инициализирован; начальное значение по умолчанию для типа такого поля необходимо никогда не соблюдаться.

Другими словами, , даже если само выражение не было константой , не должно быть ссылки на Class1 . Так что да, ты в порядке. Это не обязательно гарантирует, что объединенное значение используется в байт-коде, но биты, упомянутые ранее, гарантируют, что объединенное значение интернировано, поэтому я был бы чрезвычайно удивлен, если бы это не просто встроили конкатенированное значение. Даже если этого не произойдет, вы гарантируете, что он будет работать без Class1 .

23
ответ дан 30 November 2019 в 07:44
поделиться

При компиляции с javac 1.6.0_14 следующий байт-код:

public void someMethod();
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String ABCDEF
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

Таким образом, строки объединяются во время компиляции, и результат включается в пул констант Class2.

10
ответ дан 30 November 2019 в 07:44
поделиться

Он будет встроен не компилятором, а интерпретатором во время выполнения и, если возможно, преобразован в код сборки.

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

К сожалению, у меня нет ссылки для подтверждения этого :(

0
ответ дан 30 November 2019 в 07:44
поделиться

Я подозреваю, но не знаю наверняка, что это сработает, но это не похоже на хорошую идею.

"Обычные" способы сделать это:

  1. Поместите константы в пакет, совместно используемый клиентом и сервером. По-видимому, такой пакет существует, потому что именно там находятся интерфейсы.
  2. Если такого пакета нет, создайте 2 класса с общими константами: один для сервера и один для клиента.
0
ответ дан 30 November 2019 в 07:44
поделиться

См. JLS 13.4.9 . Хотя он явно не требует, чтобы константы были встроены компилятором, он намекает на то, что условная компиляция и поддержка констант в операторах switch заставляют компилятор всегда вставлять константы.

0
ответ дан 30 November 2019 в 07:44
поделиться

Похоже, вы кодируете свою собственную версию функции, встроенной в enum , которая делает public static final для вас, правильное именование с помощью name () и toString () (а также имеет некоторые другие преимущества,

0
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

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