java导入中的名称冲突

前端之家收集整理的这篇文章主要介绍了java导入中的名称冲突前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
除非我们 change the compiler,Java错过了导入X作为Y语法,这在我的情况下会很有用:在这个时刻我正在研究一个项目,它有多个具有相同名称的类,但属于不同的包.

我想有类似的东西

  1. import com.very.long.prefix.bar.Foo as BarFoo
  2. import org.other.very.long.prefix.baz.Foo as BazFoo
  3.  
  4. class X {
  5. BarFoo a;
  6. BazFoo b;
  7. ...
  8. }

相反,我完成了类似的事情

  1. class X {
  2. com.very.long.prefix.bar.Foo a;
  3. org.other.very.long.prefix.baz.Foo b;
  4. ...
  5. }

这看起来非常有害,但在我的具体情况下,我需要使用水平滚动来浏览我的源代码,并且这样可以使程序更糟糕,这已经是一个混乱.

根据您的经验,这种情况下的最佳做法是什么?

解决方法

我觉得你的痛苦,无论你使用哪种解决方案,都有两个同名的类很容易让人困惑.

解决方法有几种解决方法

>如果这是您的代码,只需重命名其中一个(或两者)
>如果这是库(更有可能)导入更常用的类,完全符合另一个类,正如Jeff Olson建议的那样.
>如果可能的话,尽量避免让他们在同一个班级.
>您可以编写自己的BarFoo和BazFoo,除了扩展各自的Foo类之外什么都不做,从而为它们提供自己的名字.您甚至可以将它们定义为内部类.例:

  1. private BarFoo extends com.very.long.prefix.bar.Foo{
  2. //nothing,except possibly constructor wrappers
  3. }
  4.  
  5. private BazFoo extends com.very.long.prefix.bar.Foo{
  6. //nothing,except possibly constructor wrappers
  7. }
  8.  
  9. class X {
  10. BarFoo a;
  11. BazFoo b;
  12. //...
  13. }

但是有一些缺点:

>你必须重新定义构造函数
>如果你需要将它传递给一个明确检查其getClass的函数,它将不是完全相同的类.

您可以通过包装Foo类而不是扩展它们来解决这些缺点,例如:

  1. private BarFoo {
  2. public com.very.long.prefix.bar.Foo realFoo;
  3. }
  4.  
  5. private BazFoo extends com.very.long.prefix.bar.Foo{
  6. public com.very.long.prefix.baz.Foo realFoo;
  7. }
  8.  
  9. class X {
  10. BarFoo a;
  11. BazFoo b;
  12.  
  13. //now if you need to pass them
  14. someMethodThatTakesBazFoo(b.realFoo);
  15. }

选择最简单的解决方案并祝你好运!

猜你在找的Java相关文章