2011-01-07 9 views
1

私は、他の場所のコードでは、このようなことを行うことができることを、このようなJavaクラスREFを宣言できるようにしたいと思います:Javaで定数階層データ構造を宣言するには?

switch (v) 
{ 
case Ref.LicenseCode:      ....; 
case Ref.Widget.MaxWeight:    ....; 
case Ref.Widget.MolyBolt.ThreadsPerInch: ....; 
} 

REFは、一定の階層的な集合を表す定数データ構造であることを意図しています値は、標準文書やその他の参照資料によく現れることがあります。本当に一定の値が必要です(ケースステートメントで使用できます)。

私はクラス定義を入れ子にすることでこれを行うことができると思っていました。たとえば、この:私がダウンして第3レベルに巣にしようとすると、

switch (v) 
{ 
case Ref.LicenseCode:      ....; 
case Ref.Widget.MaxWeight:    ....; 
} 

しかし:

public final class Ref 
{ 
    public final static int LicenseCode = 800; 

    public final class Widget 
    { 
     public final static int MaxWeight = 5000; 

     public final class MolyBolt 
     { 
      public final static int ThreadsPerInch = 12; 
     } 
    } 
} 

私がいることを聞いています:

public final class Ref 
{ 
    public final static int LicenseCode = 800; 

    public final class Widget 
    { 
     public final static int MaxWeight = 5000; 
    } 
} 

は私がこれを書くことができます

"Ref.Widget.MolyBolt cannot be resolved or is not a field." 

私は何か間違っていますか?それとも、私はJavaのエッジの1つにぶつかったのですか?私の目標を達成するための他の方法がありますか?私はWindows Vista、JCK 1.6.0-21の下でEclipse Java Development Tools 3.5.2.r352を使用しています。

+2

MolyBoltはフィールドではありません。それはクラスです。あなたは "Ref.Widget.MolyBolt.ThreadsPerInch"を意味しましたか? – rfeak

+0

申し訳ありませんが、Ref.Widget.MolyBolt.ThreadsPerInchを参照しようとしましたが、結果のエラーは "Ref.Widget.MolyBoltを解決できないか、フィールドではありませんでした"でした。 –

+0

これらの奇妙な定数、LicenceCodesとWeightsなどは、まあまあまあの例です。私はもっ​​と理にかなっているが、それはかなり秘密だということを心に留めている。より現実的な例は、惑星や衛星のすべてを含む、太陽系に関する一定の値の表であるかもしれません。私が書くことができる場合: ケースSolar.Sun.Weight:....; ケースSolar.Mars.Deimos.Weight:....; 私はおそらく私が必要とするすべてを行うことができました。 –

答えて

0

どのようにThreadsPerInchフィールドを参照していますか?これは私の作品:私は変更したい

public final class Ref { 
    public final static int LicenseCode = 800; 
    public final class Widget { 
     public final static int MaxWeight = 5000; 
     public final class MolyBolt { 
      public final static int ThreadsPerInch = 12; 
     } 
    } 
    public static void main(String[] args) { 
     int v = Integer.valueOf(args[0]); 
     switch (v) { 
      case Ref.LicenseCode: 
       break; 
      case Ref.Widget.MaxWeight: 
       break; 
      case Ref.Widget.MolyBolt.ThreadsPerInch: 
       break; 
     } 
    } 
} 

唯一のことは、あなたはおそらく、とにかくこのクラスの任意のオブジェクトをインスタンス化するつもりはないが、内部クラスを静的にすることです。

+0

私は今2人のレスポンダーに問題がないと言っています。私はこれを調べます...おそらく私は* Eclipse *の問題を抱えています。私は戻って報告します。 –

+0

私は抽象的な静的を使用します。地獄、インターフェイスを使用してください。 – irreputable

+0

どうもありがとうございました、あなたに働いてくれているとおっしゃった皆さん。ご想像のとおり、上記の例よりもはるかに大きなコードに取り組んでいます。実際、私は既存の大規模なデータ構造を変えようとしていますが、これは定数ではありません(不変ではありません!)、Eclipseを使って可能なソリューションをエアチェックしています。ファイルは大きく、私の実験のためにファイルの後ろにいくつかのエラーがあります。これらのエラーの1つが私のエラーメッセージの根底にある原因であることが判明しました。私がまだ更新されていないコードをすべて削除すると、問題は修正されました。 –

2

私には請求書情報のように見えます。これを静的なデータとしてJavaクラスに埋め込むことは、私にとって非常に厳しいようです。リレーショナル、階層、オブジェクト、またはグラフのデータベースに格納する方がはるかに自然です。

もう1つの問題は、これを処理するコードがif/then/elseのスパゲッティフォレストまたは処理するswitch文になることです。

これが間違っているように見えますが、これを過大評価するのは難しいです。あなたは進むことができる答えを得るかもしれませんが、これは悲しみで終わることができます。

+1

これは組み込み製品に組み込まれており、一定の不変の階層的なデータ構造を格納することは、それを動作させることができれば、理想的なソリューションのように思えます。アクセスするのが難しいと思われるコードはわかりません。私は単にデータ構造について話しています。一定の値を調べるために、より明確でより簡潔な方法を提案できれば、私はそれです。 –

+2

組み込みクラスの階層にハードコードされたJava以外のものはどれも良いでしょう。地獄、それをXML文書に格納し、XPathを使ってメモリ内のDOMを検索する方が良いでしょう。あなたが提案しているもの以外のもの。 – duffymo

+0

それは狂った話です。ですから、javaの代わりにxmlに同じ情報を書いても、ほぼ同じ構造で、突然より良いのですか?何のために? – irreputable

関連する問題