除非我们change the compiler , Java 缺少 import X as Y
语法,这在像我这样的情况下很有用:此时此刻,我正在处理一个项目,该项目具有多个同名但属于不同包的类.
我想要一个类似的东西
import com.very.long.prefix.bar.Foo as BarFoo
import org.other.very.long.prefix.baz.Foo as BazFoo
class X {
BarFoo a;
BazFoo b;
...
}
相反,我完成了类似的事情
class X {
com.very.long.prefix.bar.Foo a;
org.other.very.long.prefix.baz.Foo b;
...
}
这似乎非常有害,但在我的具体情况下,我需要使用水平滚动来浏览我的源代码,这会使已经一团糟的程序变得更糟。
根据您的经验,这种情况下的最佳做法是什么?
最佳答案
我感受到你的痛苦,无论你使用哪种解决方案,有两个同名的类这一事实已经足够令人困惑了。
有几种解决方案解决方法:
- 如果这是您的代码,只需重命名其中一个(或两个)
- 如果这是库(更有可能)导入更常用的类,则按照 Jeff Olson 的建议完全限定另一个。
- 如果可能的话,一开始就尽量避免让他们在同一个类(class)。
- 您可以编写自己的
BarFoo
和BazFoo
,它们除了扩展各自的Foo
类之外什么都不做,从而为它们提供自己的名称。您甚至可以将它们定义为内部类。示例:
private BarFoo extends com.very.long.prefix.bar.Foo{
//nothing, except possibly constructor wrappers
}
private BazFoo extends com.very.long.prefix.bar.Foo{
//nothing, except possibly constructor wrappers
}
class X {
BarFoo a;
BazFoo b;
//...
}
不过也有一些缺点:
- 你必须重新定义构造函数
- 如果您需要将它传递给显式检查其
getClass
的函数,则它不会是完全相同的类。
您可以通过包装 Foo 类而不是扩展它们来解决这些缺点,例如:
private BarFoo {
public com.very.long.prefix.bar.Foo realFoo;
}
private BazFoo extends com.very.long.prefix.bar.Foo{
public com.very.long.prefix.baz.Foo realFoo;
}
class X {
BarFoo a;
BazFoo b;
//now if you need to pass them
someMethodThatTakesBazFoo(b.realFoo);
}
选择最简单的解决方案,祝你好运!
关于java - Java 导入中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738854/