JavaRush/Java блог/Архив info.javarush/Уникальное имя для объекта
djigurda71
28 уровень

Уникальное имя для объекта

Статья из группы Архив info.javarush
участников
Требуется создавать уникальное имя для каждого объекта в цикле. Примерный код : Уникальное имя для объекта - 1
for(int i = 0; i < 10; i++) {
    Cat ? = new Cat();
}
Не могу понять, как с помощью цикла реализовать уникальное имя для каждого кота?
Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Phozar
Уровень 10
22 июля 2023, 08:29
В Java имена переменных нельзя генерировать динамически или объединять со значениями во время выполнения. Поэтому предоставленный вами код неверен и не будет компилироваться.
niporka1992
Уровень 9
18 июля 2020, 21:25
int count=0; while (count<=50000){ Cat cat = new Cat(); count++; } int count1=0; while (count1<=50000){ Dog dog = new Dog(); count1++; } Не принимает(( что не так?
Archie369
Уровень 18
7 февраля 2017, 12:29
Говорят «You can't do this in Java»
stackoverflow.com/questions/7762848/increment-variable-names
Torin
Уровень 27
6 февраля 2017, 15:26
Имя объекта а не имя переменной. Каждый раз как срабатывает конструктор new Cat() вы генерируете уникальный объект расположенный по уникальному адресу, но ссылка Cat всегда одна (у вас). Вы в цикле генерируете новый объект и присваиваете его одной и той же ссылке, затирая старый. Так что вы хотите сделать? Уникальная ссылка или уникальный объект? покажите класс Cat. Есть ли у него поле name? И напишите реальное задание, а не то, как вы его поняли
djigurda71
Уровень 28
6 февраля 2017, 15:53
Вопрос здесь стоит как указание того места, которое меня интересует, я понимаю, что происходит в моем коде(спасибо). Требуется привязка значения переменной «i»(т.к. она изменяемая, можно любую другую, не суть) к имени Объекта т.е. cat0, cat1 cat2 и так далее. Класса Cat нету, привел абстрактный пример для простоты понимания чего я хочу, к заданию отношения не имеет, и задания как такового нету, делаю проект под android для себя. в Топике указал Все что нужно.
Torin
Уровень 27
6 февраля 2017, 15:58
я понимаю, что происходит в моем коде(спасибо).
Судя по вашему вопросу я поставлю под сомнение это утверждение. Но все же.
cat это не имя объекта, это имя переменной, которой можно присвоить любой объект. Если вы хотите получить уникальную ссылку (для каждого объекта отдельная ссылка) создайте массив ссылок. Вне цикла for пишем

Cat[] cats = new Cat[10];

Далее уже в цикле

cats[i] = new Cat();

Т.е. вот так:

Cat[] cat = new Cat[10];
for(int i = 0; i < 10; i++) {
    cat[i] = new Cat();
}
djigurda71
Уровень 28
6 февраля 2017, 16:22
Вот это уже больше по делу, спасибо. Но все же хотелось бы знать как это сделать без создания массива, есть ли такая возможность вообще, потому что я помню, что видел такое, но не помню где
Torin
Уровень 27
6 февраля 2017, 16:39
Обратите внимание на конструкцию «cat+i» — к имени переменной приписывается какое-то число и потом используется. Это нормально для скриптовых языков, но java язык компилируемый. В принципе в ней есть хитрая возможность достичь того, чего вы хотите с помощью рефлексии… Но вы лучше скажите _зачем_ вам это? Объявление 100 классов с одинаковыми именами выглядит исключительно глупо. Если вы к этому ещё и рефлексию примените — вас точно будут считать ненормальным. Извините за прямоту… ;-)

Цитата из интернетов. Вообще лучше джаву поучить, хотя бы на джавараш, а потом уже писать на андроид. Может вы конечно знакомы с другими языками (возможно даже скриптовыми), но в джаве хватает камней, об которые будете спотыкаться в процессе работы в андроид-окружении
Torin
Уровень 27
6 февраля 2017, 16:47
Хотел еще написать про коллекции, но лень. Потому что

Да-а-а… Когда надо много — то это массив… (или одна из коллекций — но разница непринципиально)… Создание отдельных переменных с похожими именами это типичная ошибка новичков (например если они пишут «калькулятор» и в нём создают много кнопок… ;-)

Рефлексия, о которой я говорил, пользуется специфическими свойствами скомпилированного кода java и позволяет доставать классы, объекты, их поля и методы по именам, менять им модификаторы доступа… Когда вы захотите узнать об этом побольше, вы сможете погуглить по этому слову. Однако используется этот подход в очень специфичных и сложных задачах, например когда требуется как-то конфигурировать достаточно произвольные объекты по текстовым конфигурационным файлам и т.п… короче в таких, к которым данная проблема не относится.

Однако полезно знать в какие структуры можно запихнуть «множества» созданных объектов. Вот массив позволяет впоследствии добираться до нужного объекта по его индексу. LinkedList позволяет хранить связку объектов, в которой удобно работать только с концевыми элементами, зато удобно также наращивать, удалять, вырезать куски из разных мест. HashMap позволяет хранить объекты как и в массиве, но с доступом не по индексу а по какому-то произвольному объекту-ключу (например по текстовому имени) — причём весьма быстро. Также подходит для реализации массивов с дырками и т.п. Ну и так далее...

Все уже давно написано за нас.
24 июня 2020, 22:26
djigurda71, нашел ответ?
Totem
Уровень 25
6 февраля 2017, 15:04
Просто переменную i добавляй к имени каждый раз.
djigurda71
Уровень 28
6 февраля 2017, 15:12
это я понимаю, но каким образом это реализовать не могу понять.
что- то вроде:

Cat cati = new Cat();
Cat i = new Cat();
Cat cat + i = new Cat();

Понятное дело не срабатывает
PERFORATTOR
Уровень 19
24 октября 2021, 19:07
Как? Тоже не работает.