当类名称冲突时导入包而不是类?

时间:2016-09-08 13:05:37

标签: java java-8 dependencies

我正在开发一个应用程序,我有两种名为Asset的类型,来自不同的包。我知道我可以在包的路径前面添加类型,但它们都非常长,并且它们都需要作为参数传递给方法,这看起来很糟糕。 我拥有的两个班级是:

really.long.path.to.this.one.package.Asset

Ridiculusly.long.path.to.this.otherPackage.Asset

由于这两种类型都用于参数和返回类型,我最终会遇到这种情况:

import really.long.path.to.this.one.package.Asset;

private List<Ridiculusly.long.path.to.this.otherPackage.Asset> getSimilarAssets(Ridiculusly.long.path.to.this.otherPackage.Asset asset,String otherParam){...}

,当非嵌入式Asset-type在参数列表中时,某些方法看起来更糟。

这两种类型都不受我的控制,我无法用其他任何方式交换。

我知道我不能以正常的方式导入这两个类(这已在其他地方得到解答),但是我可以以某种方式导入一个父级包,这样我就可以只写一部分路径了吗? 在我看来,如果我可以导入一些作为Asset之一的父类的包,我可以在方法定义中减少相当多的路径。上面的方法可能看起来像:

private List<otherPackage.Asset>getSimilarAssets(otherPackage.Asset asset, String otherParam){...}

我认为这可行,因为2个类的父包是不同的,但我似乎无法将包的工作引用到我的类中。任何方式都可以这样做?

2 个答案:

答案 0 :(得分:1)

理想情况下,您需要的内容更像是C ++的typedefusing关键字。可悲的是,Java并不支持这一点。

您可以做的最好 - 但这会侵入您的程序源代码 - 考虑定义两个自己的 Asset类,每个类都在不同的(但更短的)路径中,或者,或者使用不同的名称:

class Asset extends Ridiculusly.long.path.to.this.otherPackage.Asset
{
    /*constructors calling super*/
}

并实例化Asset的这些版本,而不是具有长名称的版本。在实现这一点时,您不会在import中遇到任何歧义。但是你必须承担编写构造函数存根的开销,因此这可能是不可行的。

但是,我会这样做吗?答案是不。原因是我认为最好使用 而不是使 使用您选择用于实现的语言。在采用这种方法之前,请特别考虑本文。 http://www.ibm.com/developerworks/library/j-jtp02216/

答案 1 :(得分:0)

您可以获得的最好的方法是导入一个类(使用更多的类)并将FQN用于另一个类。如果您正在使用其软件包中的其他类,则您也需要单独导入它们。

没有办法创造&#34;部分进口&#34;像你一样希望。很高兴它只是一个眼睛,而不是一个复杂的设计问题,阻碍你继续发展。