Имя переменной в Java.

113
Находится в разделах:

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

Итак, привожу цитату из документации:

A variable's name can be any legal identifier — an unlimited-length sequence of Unicode letters and digits, beginning with a letter, the dollar sign "$", or the underscore character "_".

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

Ну, вроде как все понятно. Однако меня смутило вот это выражение: "unlimited-length" - неограниченная длина. Как это понять? Неограниченность  - это же бесконечность. Но ведь так не может быть. Всему должны же быть какие то пределы, какие то рамки, согласитесь.
Давайте же попытаемся разобраться, как обстоят дела на самом деле.

Итак, чему мы можем задать имя? Классу, полю класса(Instance variables/Class/static variables), методу класса, локальной переменной. И неужели все это может иметь имена неограниченной длины???

С точки зрения самого языка Java, спецификации JLS - да, все имена могут иметь сколькоугодно большую длину. То есть: An identifier is an unlimited-length sequence - абсолютно корректное утверждение.

Однако тут из-за кулис появляется виртуальная машина Java(JVM) - у которой, свой собственный взгляд на имена. В соответствии со спецификацией JVM:

The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANT_Utf8_info structure.

То есть, JVM ограничивает размер идентификатора 65535 символами.

Однако такое ограничение не накладывается на локальные переменные. Почему? Потому что при компиляции, происходит замена имен локальных переменных на внутренний идентификатор. Делается это с целью оптимизации. Именно поэтому при декомпиляции бай кода невозможно восстановить имена локальных переменных заданных разработчиком.

Значит, идентификатор локальной переменной - единственный, кто может иметь неограниченную длину, все остальные - максимум 65535 символов.

Вроде ситуация как бы и прояснилась, давайте подумаем, существуют ли какие то еще факторы, способные влиять на длину имени.
При компиляции .java файла  компилятор создает файл .class с таким же самым именем, как и имя класса. Эт мы знаем, но к чему это? - спросите вы.
А заковырка в том, что каждая файловая система накладывает свои ограничения на максимально допустимое имя файла. Например, для файловой системы NTFS, максимально допустимое имя файла в сумме с его расширением не должны превышать 255 символов. Значит, 255 символов - 6 символов(.class) = 249 символов для имени.
Вот и получается, что класс, у которого имя превышает 249 символов не будет скомпилирован, так просто-напросто невозможно создать такой файл. 
Для других файловых систем свои ограничения.

Давайте теперь подытожим:

  • имя класса, не может быть длиннее 249 символов для NTFS;
  • имя метода, переменная класса не более 65535 символов;
  • локальная переменная - можем задать любую длину.

Как это все можно проверить?

  • Проверка для имени класса: задайте имя превышающее установленный лимит, и попробуйте скомпилировать файл Smile
  • Проверка для имени метода или переменной класса: задайте имя больше 65535 и получите исключение типа такого: Exception: UTF8 representation for string "iiiiiiiiiiiiiiiiiiii..." is too long for the constant pool;
  • Проверка для локальной переменной: поэкспериментируйте с различной длиной и сравните, как меняется размер .java файла и как НЕ меняется размер .class файла.

Вывод: с одной стороны, данная статья может показаться абсолютно бредовой, кого интересует, какая там длина максимально допустима? Ведь никогда в жизни ее не достигнем. Да, вы абсолютно правы. Однако, думаю, это все будет полезно для понимания того, как оно все вообще устроено.

Для тех, кто дочитал до самого конца, бонус, маленькая считалка, о том, как надо задавать идентификаторы:

Seven syllable class names
 five for variables
 seven for method and other names


  Все.



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

Fruzenshtein аватар

+1

Казалось бы где и что можно написать об идентификаторах переменных? Ну кроме того какие символы туда должны входить...

А так еще одна грань обсуждения переменных раскрытаCool

спасибо, я старался Smile И очень приятно, когда это оказывается кому то еще полезным и интересным.

Fruzenshtein аватар

Это комьюнити вообще для меня оказалось приятной находкой. Только до сих пор не могу привыкнуть к его названию.

Раньше учил РНР, CSS, HTML, MySQL... Короче ВЭБером думал быть.

Потом плюнул и взялся за ДЖАВУ, начал гуглить ресурсы, а их вообще нет.

В итоге наткнулся на этот и еще один. Втройне приятно, что оба являются украинскимиLaughing

я к названию не то что не привыкнуть, я его вообще с трудом выговариваю LaughingLaughingLaughing

Таки действительно на данном сайте собрано просто громадное количество информации по Java, причем написано все на доступном языке и в максимально доходчивом стиле. Max постарался на славу конечно.

Если у Вас возникнет желание, то можете тоже присоеденится к нашему скромному, но уютному коллективу авторов Smile эт классно!

 

Fruzenshtein аватар

Я бы присоединился, если бы не одно, НО! Я пока, что зеленый в ДЖАВЕ. Даже не знаю, какую "ветку" развития выбрать... То ли JAVA 2EE, то ли JAVA SE... Или под WEB писать... Базу я уже изучил по книге, вот думаю 9.12.2010 сходить в НАУ на конференцию, может быть там чего толкового услышу, а после 9-го буду искать работу ужеSmile

В общем все у меня еще впередиLaughing

max аватар

Однозначно j2ee.  Хотя без SE  его не освоить.  В j2ee  будете денег иметь в несколько раз больше Innocent

Fruzenshtein аватар

В таком случае буду держать курс на J2EECool

 

А, какого рода проекты на ней реализуются?Undecided

аудитория 6.205? Laughing

Fruzenshtein аватар

Написано в расписании семинара 6.200 Foot in mouth

 

График (ауд. 6.200):
13:30 Открытие, вводная часть - Василий Чекуров (проф. разработчик)
13:50 Java: построение интерфейсов пользователя - Василий Чекуров (проф. разработчик)
14:15 Java: работа в сетях - Василий Чекуров (проф. разработчик)
14:40 Технология Java EE - Андрей Родионов (преподаватель)
15:00 Работа с Java, Open JDK: практические приемы - Сергей Гринев (инженер Oracle)
15:40 Оптимизация работы Unix/Linux серверов - Игорь Скальский (сетевой инженер)
16:00 Язык MySQL и оптимизация запросов к БД - Александр Пилипенко (проф. разработчик)
16:20 О современных системах электронной коммерции - Александр Орехов (директор компании)
16:50 Подведение итогов, закрытие - Василий Чекуров (проф. разработчик)

 

Вот такая там раскладкаCool

Искреннее спасибо за статью. Понравилось.

НО!

public class A{

 

  public void meth(){

    int variable=0; //8 letters

  }

}

//размер class-файла : 323

 

----------------------------------------------

public class A{

 

  public void meth(){

    int variablevariable=0; // 16 letters (+ 8)

  }

}

//размер class-файла : 331

объясните, please, по поводу "Проверка для локальной переменной: поэкспериментируйте с различной длиной и сравните, как меняется размер .java файла и как НЕ меняется размер .classфайла."

 

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

Спасибо за считалку.

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке