Столкновения между 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 генерируется код, и он должен стараться избегать коллизий имен в предположении, что люди иногда будут выбирать неожиданные имена.

Поэтому предположим в этом примере, что

  1. необходимо указать полное имя класса в методе' test ()'. чтобы избежать столкновения.
  2. переменная 'nl' - это просто имя, используемое в определении схемы.
  3. создание поля типа _nl__ и наличие геттеров и сеттеров будет изменением, которое нарушит обратную совместимость, потому что поле nl всегда было общедоступным.

Кроме того, чтобы говорить людям: "просто не делайте этого".

Есть ли решение, чтобы избежать этих конфликтов?

Обратите внимание, что для ошибки AVRO, которая вызвала этот вопрос, я нашел обходной путь. Здесь Я ищу "общий ответ".

1 6

1 ответ:

Я вижу два решения этой проблемы:

1) вызовите метод, используя имя метода, определяемое только текущим именем класса, вместо полного имени:

public void option1() {
    NamingClash.foo();
}

2) вызовите статический метод через указатель текущего объекта класса this и подавите предупреждение "static-access".

@SuppressWarnings("static-access")
public void option2() {
    this.foo();
}