2013-03-06 18 views
5

これを正しく文言しているかどうかわかりません。詳細が必要な場合はお知らせください。 システム環境変数に基づいて変数のタイプを決定する必要があるという要件があります。コンパイル時のプリミティブ変数型

だから、私たちは次のクラス

class Test 
{ 
    DUMMY_TYPE testVariable; 
} 

DUMMY_TYPEがシステム変数に基づいて決定される持っていると言います。だからJavaがコンパイルされるときに、JavaがSystem Environment変数を使用してコンパイル・タイプで型を判別することは可能ですか?

また、これをEclipse上で何とか設定することができます.Eclipseでは、どこでもEclipseでDUMMY_TYPEが表示されますが、コンパイルとビルドでは環境変数に基づいてDUMMY_TYPEを正しいタイプに置き換えることができます?

+0

クールな質問を。好奇心のために、このユースケースが何であるか質問してもらえますか? – asteri

+7

簡単な答えはいいえ、あなたがしようとしていることが分からなければ、合理的な選択肢があるかどうかを知ることは難しいです。 –

+0

これは、内部で使用され、ソケット経由でプロプライエタリシステムとやりとりするAPIの一部です。内部システムは、同じ変数に対して整数または2倍をストリーミングすることができます。これは、環境変数を使用してその決定を行います。したがって、別のコードベースを維持する代わりに、コンパイル時に、これを判断できれば、頭痛の多くを節約できます:)。私たちはC++とC#でこれを実現できましたが、Javaは悲しみを与えてくれました。 – Karthik

答えて

1

私は考えがあります。

ObjecttestVariable(またはObjectを拡張するDummyTypeクラス)にします。次に、システム変数から読み取ったものに基づいてプリミティブラッパークラスを使用して、必要なデータを変数にロードできます。

ので:もちろん

public class Test { 

    Object testVariable; 

    { 
     String whichType = null; 

     //Logic to read your system variable from wherever and store it in whichType 

     if(whichType.equals("int")) { 
      testVariable = new Integer(intVal); 
     } 
     else if(whichType.equals("double")) { 
      testVariable = new Double(doubleVal); 
     } 
     //etc. 
    } 

、これは必ずしも、あなたが望むように、それはコンパイル時で入力した「把握」(と割り当てが実行時に場所を取るだろう、と、JavaではありませんTestオブジェクトが作成されました)、代替のための合理的なフレームワークのようです。

また、初期化時にtestVariableの値を自然に設定することもできます。

また、あなたがStringなどの入力を受け付け、このような方法を持つことができます(お使いのシステム変数から読み取る)とプリミティブ型の適切なラッパークラスでそれを返します。

public Object getPrimitiveValue(String type, String value) { 
    if(type.equals("int")) { 
     return new Integer(Integer.parseInt(value)); 
    } 
    else if(type.equals("double")) { 
     return new Double(Double.parseDouble(value)); 
    } 
    //etc. 
} 
+0

これは、尋ねられていることの合理的な近似のようです。また、型が 'Integer'または' Double'であるため、スーパークラスは 'Object'ではなく' Number'である可能性があります。 –

+0

ジェフ、私たちはこれについて考えました。しかし、API内で使用するライブラリは、変数のプリミティブバージョンを使用します。したがって、我々はアプリケーションのためにこれを行うことはできませんでした。 Butt私はNathanielに同意します。これは、他の制限がない限り、これは間違いなく実行可能な解決策です。ありがとう。 – Karthik

+0

@ user1524088彼らが原始的なバージョンを受け入れるという事実は、自動的にアンボックスするか、明示的に 'Integer'の' intValue() 'メソッドを呼び出すので問題にはなりません。 – asteri

関連する問題