Java变量名与顶层包名冲突问题

6
受此错误报告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错误中,我找到了一种解决方法。在这里,我正在寻找“通用答案”。

2
https://dev59.com/aHjZa4cB1Zd3GeqPZAql - Agoston Horvath
1个回答

1
我可以看到两个解决方案:
1)使用仅限于当前类名的方法名来调用该方法,而不是完全限定的名称:
public void option1() {
    NamingClash.foo();
}

2) 通过当前类对象的 this 指针调用静态方法,并抑制 "static-access" 警告。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接