Существует также инструмент PHP UML, доступный от груша .
PHP_UML:
это на командной строке через:
$ pear install pear/php_uml
(Это раньше было $ pear install pear/php_uml-alpha
, но пакет с тех пор пошел стабильный.)
Генерируют Ваш xmi:
$ phpuml -o project.xmi
Это гарантированно будет обрабатываться как постоянное выражение и гарантированно интернировано раздел 15.28 JLS :
A compile- выражение постоянной времени выражение, обозначающее значение примитивный тип или String, не завершен резко и составлен используя только следующее:
- Литералы примитивного типа и литералы типа String (§3.10.5)
- Преобразование в примитивные типы и преобразование в тип String
- Унарные операторы +, -, ~ и! (но не ++ или -)
- Мультипликативные операторы *, / и%
- Аддитивные операторы + и -
- ...
...
Константы времени компиляции тип String всегда "интернированы", чтобы делиться уникальные экземпляры, используя метод String.intern.
Это еще не значит, что он гарантированно будет встроен. Однако в разделе 13.1 спецификации говорится:
Ссылки на постоянные поля. переменные (§4.12.4) разрешаются в время компиляции до постоянного значения что обозначено. Никаких ссылок на такие постоянное поле должно присутствовать в код в двоичном файле (кроме класс или интерфейс, содержащий постоянное поле, которое будет иметь код для его инициализации), и такая константа поля всегда должны казаться инициализирован; начальное значение по умолчанию для типа такого поля необходимо никогда не соблюдаться.
Другими словами, , даже если само выражение не было константой , не должно быть ссылки на Class1
. Так что да, ты в порядке. Это не обязательно гарантирует, что объединенное значение используется в байт-коде, но биты, упомянутые ранее, гарантируют, что объединенное значение интернировано, поэтому я был бы чрезвычайно удивлен, если бы это не просто встроили конкатенированное значение. Даже если этого не произойдет, вы гарантируете, что он будет работать без Class1
.
При компиляции с 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.
Он будет встроен не компилятором, а интерпретатором во время выполнения и, если возможно, преобразован в код сборки.
Это не может быть гарантировано, потому что не все интерпретаторы (JVM) работают одинаково. Но наиболее важные реализации подойдут.
К сожалению, у меня нет ссылки для подтверждения этого :(
Я подозреваю, но не знаю наверняка, что это сработает, но это не похоже на хорошую идею.
"Обычные" способы сделать это:
См. JLS 13.4.9 . Хотя он явно не требует, чтобы константы были встроены компилятором, он намекает на то, что условная компиляция и поддержка констант в операторах switch
заставляют компилятор всегда вставлять константы.
Похоже, вы кодируете свою собственную версию функции, встроенной в enum
, которая делает public static final
для вас, правильное именование с помощью name ()
и toString ()
(а также имеет некоторые другие преимущества,