2016-03-25 11 views
6

Attivato da questa segnalazione di bug AVRO-1814 Ho ridotto il problema a questo caso di esempio minimale in Java che mostra semplicemente il nucleo dell'effetto.Nome collisione Java tra variabile e nome del pacchetto di livello superiore

package nl.basjes.experiment; 

public class NamingClash { 
    String nl = "foo"; 

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

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

Cercando di compilare questo vi darà

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

Nel AVRO il codice viene generato e si deve cercare di evitare conflitti di nomi sotto la gente assunzione a volte scegliere i nomi inaspettati.

Quindi, assumere in questo esempio che

  1. Il nome completo della classe nel 'test()' è necessaria metodo per evitare una collisione.
  2. La variabile 'nl' è solo il nome utilizzato nella definizione dello schema.
  3. Generare un campo come _nl__ e avere getter e setter sarebbe una modifica che interromperà la compatibilità perché il campo nl è sempre stato pubblico.

Altro che dire alla gente "Non farlo".

Esiste una soluzione per evitare questi conflitti?


Si noti che per l'errore AVRO che ha attivato questa domanda ho trovato una soluzione alternativa. Qui sto cercando la 'risposta generica'.

+2

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

risposta

1

posso vedere due soluzioni al problema:

1) chiamare il metodo utilizzando un nome di metodo qualificato solo semplicemente il nome della classe attuale, invece di un nome completo:

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

2) chiama il metodo statico tramite il puntatore this dell'oggetto corrente e sopprime l'avviso di "accesso statico".

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