このバグ レポートAVRO-1814をきっかけに、この問題を Java の最小限の例に絞り込みました。これは単にエフェクトの核心を示しています。
package nl.basjes.experiment;
public class NamingClash {
String nl = "foo";
public void test() {
nl.basjes.experiment.NamingClash.foo();
}
private static void foo() {
// Do something
}
}
これをコンパイルしようとすると、
error: cannot find symbol
nl.basjes.experiment.NamingClash.foo();
^
symbol: variable basjes
location: variable nl of type String
AVRO では、コードが生成され、人々が予期しない名前を選択することがあるという前提の下で、名前の衝突を回避しようとする必要があります。
したがって、この例では、
- 衝突を避けるために、「test()」メソッドの完全修飾クラス名が必要です。
- 変数「nl」は、スキーマ定義で使用される名前です。
- _nl__ のようなフィールドを生成し、getter と setter を使用すると、nl フィールドは常に public であるため、下位互換性が失われる変更になります。
人に「そんなことはやめなさい」と言う以外に。
これらの競合を回避する解決策はありますか?
この質問を引き起こした AVRO バグについては、回避策を見つけたことに注意してください。ここで私は「一般的な答え」を探しています。