と の違いを知っています@+id
(@id
この受け入れられた回答を参照してください)。しかし、 に「+」を書くと、常に AAPT コンパイラの仕事をしているような気がし@+id
ます。
識別子を作成する必要があるか、単に再利用する必要がある場合、リソース コンパイラがそれ自体で推論できない理由はありますか? 基礎となるハッシュテーブル構造がその役割を果たします。同じ ID を持つすべてのリソースが同じバケットに入り、キーが存在しない場合は作成するだけです。
おそらく、コンパイラは「正しい」ID と「間違った」ID を区別できません。新しい ID (つまり、基礎となるハッシュテーブルにない ID) が見つかった場合、常に正しい新しい ID であると見なされます。実際の新しい ID とタイプミスされた ID を区別することはできません。
プログラマーを助けるためだと想像できます。
@+id の構築が必要ない場合は、すべての @id 参照/構築が有効になり、エラーを追跡するのが難しくなります。コンパイラは間違った参照で失敗しないためです (単純にタイプミス ID を構築するため)。 )。
別の言い方をすれば、すべての ID 参照エラーは実行時に発見する必要があります。
編集:
あなたのコメントに関して、Piovezanによる同様の回答に気付きました:
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 構造 imo を誤用しています。
@+id と @id を区別するオプションがある方がはるかに優れています。これは、(@+id を誤用しない場合) コンパイラが間違った参照に対してコンパイル時にエラーを発生させる可能性があるためです。
編集2
そして、コメントに対処するには:
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
私はそれができると信じていますが、上記の議論のためにそうではありません(私は信じています)。