变量和顶级包名称之间的Java名称冲突

Nie*_*jes 6 java namespaces name-collision

由此错误报告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
  }
}
Run Code Online (Sandbox Code Playgroud)

试图编译这将给你

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

在AVRO中,生成代码并且必须尝试避免名称冲突,假设人们有时会选择意外的名称.

所以假设在这个例子中

  1. 需要'test()'方法中的完全限定类名来避免冲突.
  2. 变量'nl'只是模式定义中使用的名称.
  3. 生成像_nl__这样的字段并具有getter和setter将是一个会破坏向后兼容性的更改,因为nl字段始终是公共的.

除了告诉人们"就是不要那样做".

有避免这些冲突的解决方案吗?


请注意,对于触发此问题的AVRO错误,我找到了一种解决方法.在这里,我正在寻找'通用答案'.

AJN*_*eld 1

我可以看到该问题的两种解决方案:

1) 使用仅由当前类名限定的方法名称而不是完全限定名称来调用方法:

public void option1() {
    NamingClash.foo();
}
Run Code Online (Sandbox Code Playgroud)

2)通过当前类对象的指针调用静态方法this,并抑制“静态访问”警告。

@SuppressWarnings("static-access")
public void option2() {
    this.foo();
}
Run Code Online (Sandbox Code Playgroud)