Столкновение имени 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
указатель и подавление предупреждения "статический доступ".
@SuppressWarnings("static-access")
public void option2() {
this.foo();
}