2016-09-08 4 views
1

私は別のパッケージからAssetという2つのタイプがあるアプリを開発しています。私は、パッケージのパスを型の前に置くことができますが、実際にはどちらも長いので、メソッドのパラメータとして渡す必要があります。恐ろしく見えます。私が持っている 2クラスは次のとおりです。クラスに競合する名前がある場合、クラスではなくパッケージをインポートしますか?

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

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

両方のタイプをパラメータにしてreturntypesとして使用されているので、私はこのような状況で終わる:

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型がパラメータリストにある場合、メソッドはさらに悪化します。

どちらのタイプも私のコントロールから外れているため、他のものと交換する方法はありません。

通常の方法で両方のクラスをインポートできないことは知っていますが(これは別の場所で回答されています)、何らかの方法で子育てパッケージをインポートしてパスの一部だけを書くことができますか? Assetのいずれかの親であるパッケージをインポートできたら、メソッド定義のパスをかなり小さくすることができます。上記の方法は、次にようになります。

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

私は2クラスの親パッケージが異なるため、これがうまくいくと仮定し、私はに私のclass.any道にパッケージへの作業の参照を取得するように見えるカントこれを行う?

答えて

0

あなたが得ることができる最良のものは、1つのクラス(より多く使用されているもの)をインポートし、他のクラスにFQNを使用することです。パッケージから他のクラスを使用している場合は、それらも別々にインポートする必要があります。

あなたが望むように「部分的なインポート」を作成する方法はありません。それは単なる目障りであり、複雑なデザインの問題ではなく、あなたが発展し続けるのを妨げていることをうれしく思います。

+0

FQNの意味を明確にすることはできますか? –

+0

完全修飾名(パッケージを含む)。 – Kayaman

+0

ああ、ちょっとあなたがそれを意味すると思っていた、私が間違っていたことを望んでいた;) –

1

理想的には、typedefまたはusingのC++のキーワードのようなものが必要です。残念ながら、Javaはそれをサポートしていません。

あなたができる最善 - これは侵入的、あなたのプログラムのソースコードを変更しない - あなた自身Assetクラス、別の(より短い)パス内の各、または、代わりに別の名前での2の定義を検討することです:

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

これらのバージョンをAssetという名前ではなく、長い名前でインスタンス化します。これを実装するにあたっては、importに曖昧さがありません。しかし、コンストラクタのスタブを書く必要がないため、これが実現できない可能性があります。

しかし、、私はこれをしますか?答えはいいえだ。その理由は、私がに対してでなくで実装することをお勧めします。このアプローチを採用する前に、特にこの記事を検討してください。 http://www.ibm.com/developerworks/library/j-jtp02216/

+0

ハァッ、それは考えなかった。ハックのように思えるかもしれませんが、それは価値があるかもしれません!私が自分のクラスの名前を変更した場合、それも 'Assets'の1つだけで十分です。私の最大の関心事は、これが私のコードを扱う人を混乱させる可能性が高いことです。どちらが悪いのか分かりません。クラスのこのハックをコードを呼び出す他のコンポーネントに返すことができるかどうかを検討する必要があります...余分な依存関係は、デングブレイカーかもしれませんが、入力のための多くの感謝、これはこれまでのところ最高の答えです! –

+1

まず、静的でない内部クラスには、ガベージコレクションを妨げる外部インスタンスへの参照が含まれていることに注意してください。第2に、既存のインスタンスでのみ動作するクラスではなく、これらのインスタンスを作成するクラスでのみ動作します。 – Holger

+2

これはハックであり、しばしば結果に伴い発生します。 http://www.ibm.com/developerworks/library/j-jtp02216/を参照してください。 –

関連する問題