2016-03-25 3 views
6

Сгенерировано этим сообщением об ошибке AVRO-1814 Я уменьшил проблему до этого минимального примера на Java, который просто показывает ядро ​​эффекта.Идентификация имени 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. полное имя класса в "тесте() метод необходим, чтобы избежать столкновения.
  2. Переменная 'nl' - это просто имя, используемое в определении схемы.
  3. Создание поля типа _nl__ и наличие геттеров и сеттеров будет изменением, которое нарушит совместимость с предыдущим, поскольку поле nl всегда было общедоступным.

Другое, чем говорить людям «Просто не делай этого».

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


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

+2

http://stackoverflow.com/questions/19406673/how-to-fully-qualify-a-class-whose-package-name-collides-with-a-local-member-nam –

ответ

1

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

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

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

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

@SuppressWarnings("static-access") 
public void option2() { 
    this.foo(); 
} 
Смежные вопросы