Столкновения между Java имя переменной и название пакета
Вызванный этим сообщением об ошибке 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__ и наличие геттеров и сеттеров будет изменением, которое нарушит обратную совместимость, потому что поле nl всегда было общедоступным.
Кроме того, чтобы говорить людям: "просто не делайте этого".
Есть ли решение, чтобы избежать этих конфликтов?Обратите внимание, что для ошибки AVRO, которая вызвала этот вопрос, я нашел обходной путь. Здесь Я ищу "общий ответ".
1 ответ:
Я вижу два решения этой проблемы:
1) вызовите метод, используя имя метода, определяемое только текущим именем класса, вместо полного имени:
public void option1() { NamingClash.foo(); }
2) вызовите статический метод через указатель текущего объекта класса
this
и подавите предупреждение "static-access".@SuppressWarnings("static-access") public void option2() { this.foo(); }