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

时间:2016-03-25 15:25:00

标签: 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
  }
}

尝试编译它会给你

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__这样的字段并拥有getter和setter将会破坏向后兼容性,因为nl字段一直是公共的。
  4. 除了告诉别人"不要那样做"。

    是否有解决方案来避免这些冲突?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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