Java 变量和顶级包名称之间的名称冲突
Java name collision between variable and top-level package name
由这个错误报告触发 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 中生成代码,它必须尽量避免名称冲突,前提是人们有时会选择意想不到的名称。
所以在这个例子中假设
- 'test()' 方法中需要完全限定的 class 名称以避免冲突。
- 变量'nl'只是模式定义中使用的名称。
- 生成像 _nl__ 这样的字段并具有 getter 和 setter 将是一个会破坏向后兼容性的更改,因为 nl 字段一直是 public.
除了告诉别人"Just don't do that"。
是否有避免这些冲突的解决方案?
请注意,对于触发此问题的 AVRO 错误,我找到了解决方法。我在这里寻找 'generic answer'.
我可以看到问题的两个解决方案:
1) 使用仅由当前 class 名称限定的方法名称调用方法,而不是完全限定名称:
public void option1() {
NamingClash.foo();
}
2) 通过当前class对象的this
指针调用静态方法,抑制"static-access"警告
@SuppressWarnings("static-access")
public void option2() {
this.foo();
}
由这个错误报告触发 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 中生成代码,它必须尽量避免名称冲突,前提是人们有时会选择意想不到的名称。
所以在这个例子中假设
- 'test()' 方法中需要完全限定的 class 名称以避免冲突。
- 变量'nl'只是模式定义中使用的名称。
- 生成像 _nl__ 这样的字段并具有 getter 和 setter 将是一个会破坏向后兼容性的更改,因为 nl 字段一直是 public.
除了告诉别人"Just don't do that"。
是否有避免这些冲突的解决方案?
请注意,对于触发此问题的 AVRO 错误,我找到了解决方法。我在这里寻找 'generic answer'.
我可以看到问题的两个解决方案:
1) 使用仅由当前 class 名称限定的方法名称调用方法,而不是完全限定名称:
public void option1() {
NamingClash.foo();
}
2) 通过当前class对象的this
指针调用静态方法,抑制"static-access"警告
@SuppressWarnings("static-access")
public void option2() {
this.foo();
}