1

私は C++ のバックグラウンドを持っています。私のJavaプロジェクトの途中で、型がブール値(以前に定義したもの)に依存する変数を定義する必要があります。これを行うことができますか:

if(Main.NEW_STYLE)
            ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>();
        else
            ArrayList<String> lineBuffer = new ArrayList<String>();

そうでない場合、解決策は何ですか?ありがとうございました

4

4 に答える 4

1

生の型 (単に) を使用することもできますが、生の型はジェネリック前のコードとの後方互換性のためにのみ存在するため、強くお勧めしません。ArrayList

適切な解決策は、おそらくそのリストをインターフェイスにカプセル化し、2 つの別個の実装クラスを持つ (そしてブール値に基づいて実装クラスを選択する) ことです。

于 2012-07-25T08:43:16.307 に答える
1

これはできますが、あまり役に立ちません。それらのスコープはArrayListif文の本体だからです。

次のことができます。

ArrayList<Object> lineBuffer;
if(Main.NEW_STYLE) lineBuffer = new ArrayList<LogFileLine>();
else lineBuffer = new ArrayList<String>();

そして、それに応じてオブジェクトをキャストします。もう 1 つの方法は、コンテナ インターフェイスを作成することです。これは、次のタイプになりますArrayList

ArrayList<LogInterface> lineBuffer = new ArrayList<LogInterface>();
lineBuffer.add(new LogInterface_LogFileLine(aLogFileLine));
lineBuffer.add(new LogInterface_String("lalelu"));

次に、2 つのバージョンの を実装します。1つは( ) をLogInterface保持し、もう 1 つは( ) を保持します。StringLogInterface_StringLogFileLineLogInterface_LogFileLine

しかし、あなたは boolean という名前を付けたのでNEW_STYLE、いつか「古いスタイル」を完全に置き換えると思うので、私からの最初の提案を行うことをお勧めします。if (Main.NEW_STYLE) ; else ;次に、にアクセスするすべての場所でこれを行う必要がありますlineBuffer。しかし、必要がなくなったら、古いものを追い出す方がはるかに簡単です。

于 2012-07-25T08:49:04.533 に答える
0

Stringfromと fromに依存するメソッドをキャプチャするインターフェイスを作成することをお勧めしますLogFileLineLogLine2 つの異なるクラスによって実装されている it または何かを呼び出してStringLogLine、を実行しFileLogLineます。

List<LogStyle> lineBuffer = new ArrayList<LogLine>();
于 2012-07-25T08:42:36.227 に答える
0

Java にはコンパイラ プリプロセッサがありません。

このステートメントの最後に ArrayList を付けようとしていると思います。したがって、これを行う方法は次のとおりです。

ArrayList lineBuffer;
if (...)
    lineBuffer = new ArrayList<String>();
else
    lineBuffer = new ArrayList<LogFileLine>();

lineBuffer.add(something);

ただしadd、実行時の問題が発生する可能性があるため、そうしないのはなぜですか

ArrayList lineBuffer = new ArrayList<Object>()

基本的に何でも保持できますか?

于 2012-07-25T08:43:28.367 に答える