Java.Переменная длина имени - PullRequest
0 голосов
/ 05 декабря 2010

в документации я прочитал, что:

A variables name can be any legal identifier — an **unlimited-length** sequence of Unicode letters and digits

Итак, я создал этот класс:

class Test{
public static void main(String args[])
{
int i=10;
}}

где i - это не я, его переменная с длиной имени - 3 000 000 chars.размер файла .java ~ 3M.

Я пытаюсь скомпилировать этот файл:

javac Test.java

В результате у меня есть Test.class с размером Test.class 4 байты.

А теперь мои вопросы:

  1. Это действительно попытка, это имя unlimited-length ??
  2. Как компилятор переводит имя моей переменной длиной 3000000 символов, что в результате у меня такмаленький .class файл?

Ответы [ 4 ]

5 голосов
/ 05 декабря 2010

iiiiiii.. - локальная переменная, то есть к ней нельзя получить доступ из других классов. Следовательно, его имя не имеет значения; компилятору не нужно его хранить. Кроме того, компилятор может просмотреть ваш код и определить, что {int i = 10;} на самом деле ничего не делает и может быть заменен на {}, поскольку обе версии выдают одинаковый вывод программы (ни одной).

1 голос
/ 05 декабря 2010

Имена локальных переменных не сохраняются как таковые.Они, как правило, удаляются как часть оптимизации компилятора и заменяются числами (см., Например, aload_<n>).

Попробуйте выполнить компиляцию с javac -g или javac -g:vars.оставьте больше информации, которую вы сможете проверить с помощью javap.

Этот ответ должен содержать интересные детали по этой теме.

Поскольку ваш пример кода нена самом деле ничего не делать, скорее всего, он будет оптимизирован в пустой метод.

1 голос
/ 05 декабря 2010

1) Я не удивлюсь, если некоторые реализации компилятора имеют (разумные) ограничения, в то время как другие могут обрабатывать имена переменных любой длины.К сожалению, я не знаю каких-либо задокументированных конкретных примеров или у меня есть какие-то особые случаи, когда речь идет о чем-то другом.

2) Имена локальных переменных не должны поддерживаться в файле класса (они не являютсядоступно через отражение).Попробуйте создать файл с длинным именем переменной экземпляра и посмотрите получившийся файл класса.

0 голосов
/ 05 декабря 2010

Компилятор, вероятно, изменил ваше действительно длинное имя на что-то скучное, вроде "a".

Имя переменной там для удобства программиста. Для компилятора и JVM не имеет значения, будет ли это 1 символ или 1 миллион, если он уникален.

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