Почему необходимо использовать @ + id вместо @id?

Я знаю разницу между @+id и @id (см. Этот принятый ответ ). Тем не менее, у меня всегда возникает ощущение, что я выполняю работу компилятора AAPT, когда пишу «+» в @+id .

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

Solutions Collecting From Web of "Почему необходимо использовать @ + id вместо @id?"

Вероятно, компилятор не сможет отличить «правильный» и «неправильный» идентификатор. Если он найдет новый идентификатор (т. Е. Тот, который не находится в базовой хеш-таблице), он всегда будет считать его правильным, новым идентификатором. Он не сможет различать фактический новый идентификатор и ошибочный идентификатор.

Я мог представить, что это поможет программисту.

Если вам не нужна конструкция @ + id, тогда все ссылки и конструкции @id будут действительны, тогда было бы трудно отследить ошибку, поскольку компилятор не смог бы ошибиться при неправильных ссылках (поскольку он просто построил идентификатор typo ).

Иначе говоря, все идентификационные ошибки id должны быть обнаружены во время выполнения.

Редактировать:

Просто заметил подобный ответ Пиовезана относительно вашего комментария:

 Maybe, but the result is that many devs use @+id everywhere, since there is no error if the id is already defined, and everything works just fine. That means the compiler tests if the id already exist, but not if it does not exist, that's crazy 

Затем эти разработчики неправильно используют конструкцию @ + id.

По-прежнему гораздо лучше иметь возможность различать @ + id и @id, поскольку (для тех, кто не злоупотребляет @ + id), у компилятора есть шанс дать ошибку времени компиляции при неправильных ссылках.

Edit2

И чтобы ответить на комментарий:

 That's the link I gave in the first sentence. It explains the difference but does not answer why the '+' cannot be automatically infered by AAPT 

Я считаю, что это возможно, это просто не из-за аргументации выше (я считаю).

С @ + id вы добавляете id в R.java, который позволяет ссылаться на него с классов Java, а с @id – нет. Вы можете использовать @id только в том случае, если определенный идентификатор уже создан, и вы ссылаетесь на него в другом представлении, например, android:layout_below="@id/some_id"