【问题标题】:Java name collision between variable and top-level package name变量和顶级包名之间的 Java 名称冲突
【发布时间】:2016-07-13 09:03:31
【问题描述】:

由这个错误报告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 字段一直是公共的。

除了告诉人们“不要那样做”。

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


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

【问题讨论】:

标签: java namespaces name-collision


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2011-11-07
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2014-08-08
    相关资源
    最近更新 更多