2016-03-25 24 views
6

Bu hata raporu tarafından tetiklenen AVRO-1814 Sorunu, bu etkiyi temel alan Java'daki bu örnek örnekte azaltmıştım. Bu kod üretilir ve bazı durumlarda beklenmeyen isimler seçecektir varsayım insanlar altında ad çakışmaları önlemek için denemek gerekir Avro olarak sizeDeğişken ve üst düzey paket adı arasındaki Java adı çakışması

error: cannot find symbol 
    nl.basjes.experiment.NamingClash.foo(); 
    ^
    symbol: variable basjes 
    location: variable nl of type String 

verecek derlemek çalışılıyor

package nl.basjes.experiment; 

public class NamingClash { 
    String nl = "foo"; 

    public void test() { 
    nl.basjes.experiment.NamingClash.foo(); 
    } 

    private static void foo() { 
    // Do something 
    } 
} 

.

Dolayısıyla bu örnekte varsayalım o

  1. yöntem çarpışmayı önlemek için gereklidir '() testi' tam olarak nitelenmiş sınıf ismi.
  2. 'nl' değişkeni şema tanımında kullanılan addır.
  3. _nl__ gibi bir alan oluşturmak ve alıcılara ve ayarlayıcılara sahip olmak, geriye doğru uyumluluğu bozacak bir değişiklik olacaktır çünkü nl alanı her zaman herkese açıktır.

İnsanlara "Sadece bunu yapma" demekten başka.

Bu çakışmaları önlemek için bir çözüm var mı?


Bu soruyu tetikleyen AVRO hatası için bir geçici çözüm buldum. İşte ben 'genel cevap' arıyorum.

sorun için iki çözüm görebilir
+2

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

cevap

1

:

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

2: Bunun yerine bir tam adının,

1) sadece geçerli sınıf adıyla nitelikli bir yöntem adı kullanarak yöntemi çağrı) geçerli sınıf nesnesinin this işaretçisiyle statik yöntemi çağırın ve "statik erişim" uyarısını bastırın.

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