2012-04-23 11 views
9

部分的に修飾された名前を持つJava型を参照できますか?もしそうなら、どうですか?部分的に修飾された名前空間を持つ参照型

シナリオ:私はしばしば、ビューを必要とするデータクラス(例えば、Activity)を見つける。私の標準的なプラクティスは、このクラスをという名前にしていますが、このビュークラスは必ずtld.organization.project.views名前空間になります。ここでは、 "View"サフィックスは完全に冗長です。

「表示」接尾辞を削除したいのですが(タイプはtld.organization.project.Activitytld.organization.project.views.Activityとなります)、同じクラスで参照するときに名前空間を使用して型を修飾する必要があります。名前空間を使用して型参照を修飾することは、それ自体では悪いことではありませんが、いずれかの型の完全修飾名を繰り返すことは繰り返して読みにくいものです。

部分的に修飾タイプ(~.Activityまたは~.views.Activityのようなもの)を参照すると、そのクラフトが削除されます。何らかの種類のエイリアスが答えるだろうが、Javaはそのような機能をサポートしていないようだ。選択肢はありますか?

tld.organization.project.views.ActivityView 

あなたがを使用するたびに:

+0

'import tld.organization.project.views。*'以外にも? –

+0

タイプの短い名前が同じであるため、このタイプのインポートは役に立ちません。私はそれを明確にするために質問を更新します。 – cqcallaw

+0

彼らは名前空間ではなく「パッケージ名」と呼ばれています。 –

答えて

4

いいえ、あなたはJavaのパッケージではできません。あなたが得ることができる最も近いものは、パッケージの代わりにクラスのネストされた階層に物を整理することです。それと戦略的な静的なインポートの間に、あなたは望みの効果を得ることができますが、ひどく面倒な解決策になります。

package tld.organization.project; 
public class Activity {} 

と::

その後と呼ぶことができる
package tld.organization.project; 
public class Views { 
    public static class Activity {} 
} 

:たとえば

public void whatever() { 
    Activity a = new Activity(); 
    Views.Activity a2 = new Views.Activity(); 
} 

私はあなたの名前で抱えている問題を指している可能性がありますことをお勧めしたいです整理する必要がある設計上の問題に直面する。

P.S.クラスを編成したプロジェクトに取り組まなければならなかったら、私は自分自身を撃たなければならないかもしれません。

P.P.S.実際に、私はおそらくあなたを撃つようにしようとします。

+0

フランクポストスクリプトのアップヴォート。 ;)私は、提案された構造の設計上の問題を見ても困っています。これは、MVCデザインパターンのかなり簡単なアプリケーションです。私は、心配の分離(この場合、データモデルとデータビュー)がほぼ普遍的に考慮されているという印象の下にあった*良い*デザインの実践。 – cqcallaw

+2

分離は多くの味で来る。 "MVC"の解釈の範囲を考えると、私はあなたが "データ"対 "ビュー"クラスの意味を理解しているとは思っていませんが、私は決して同意しなかった練習のパッケージ名にインジケータを見ます:彼らが住んでいるアプリケーションの "層"に基づくパッケージングのクラス。つまり、UserDao、AccountDao、...という "dao"パッケージを持ち、UserView、AccountView、 "view"パッケージ...それぞれが関連するクラスを含んでいる代わりに、 "ユーザー"と "アカウント"パッケージを持たせるのは、はるかに理解しやすく、パッケージに絡みにくいということです。 –

+0

興味深い。あなたの好みのアプローチの利点を見ることができますが、それは私の元の問題を解決するかどうかはわかりません:2つの機能ユニットが相互作用する(「ユーザー」DAOは「アカウント」DAOと対話する必要がある)同一の修飾されていない名前の問題。また、新しい "レイヤー"の各パッケージに新しいクラスを追加するのはかなり手間がかかりますので、新しい "レイヤー"は必要ありません。 – cqcallaw

-1

あなたが書きたいいけないことを言おうとしていますか?

使用import

など。

import javax.swing.JOptionPane; // Make a single class visible. 

class ImportTest { 
    public static void main(String[] args) { 
     JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

今あなたが直接あなたのクラスでのJOptionPaneを使用することができます。このような冒頭で

class ImportTest { 
    public static void main(String[] args) { 
     javax.swing.JOptionPane.showMessageDialog(null, "Hi"); 
     System.exit(0); 
    } 
} 

インポートクラス:代わりに、このようなクラスJOptionPaneの完全修飾名を使用します。

+0

彼は 'Activity'や' tld.blablabla.views.Activity'の代わりに 'views.Activity'という名前を部分的に修飾したいと考えています。 – sepp2k

+0

はい、申し訳ありませんが、私の質問は明確ではありません。私はそれを更新しました。 – cqcallaw

+0

'JOptionPane'がクラスであるために動作しますが、パッケージと同様のことを行うことができるようにすることです。 – Daniel

関連する問題