3

[コンテキスト:Javaの新機能、4か月のトップ。C++の古い手。]

私は多くの場所で固定サイズ(「固定文字列」)の配列を必要とするライブラリに取り組んでいます。この特定の問題に依存性注入(qv)を使用しようとしているので、次の形式が必要です。

class Foo 
{
    private Bar injectedBar;
    private char[] injectedFixedString;

    Foo(Bar injectedBar, /* what can go here? */ char[5] injectedFixedString);
    { /* initializing code goes here /* }
}

シンプルが必要です-これは自動生成された通信プロトコルに入ります。派生元のプロトコルとデータベースを完全に制御することはできません。最終的なコードには、これらのインスタンスが数千とは言わないまでも数百あります。だから、すべてを考えると:

C ++の唯一の代替手段です:

char injectedFixedString[5];

カスタムクラスを作成するには?何かのようなもの:

class FixedBarString {
    /* could also set this in the constructor, but this complicates code generation a tad */
    public static integer STRING_SIZE = 5; /* string size */
    char[] fixedString = new char[STRING_SIZE];

    FixedBarString(char[] string) throws RuntimeException {
      /* check the string here; throw an exception if it's the wrong size.
         I don't like constructors that throw however. */
    }

    public void setString(char[] string) throws RuntimeException {
      /* check the string here */
    }

    public char[] getString() {
      /* this isn't actually safe, aka immutable, without returning clone */
    }

    public char[] createBlankString() {
      return new char[STRING_SIZE];
    }
}

ありがとう。(これが多すぎるコードの場合はお詫びします)。

4

4 に答える 4

2

静的に保証された長さで必要なことを行う方法はありません。ただし、FixedBarString4、FixedBarString5などのすべての長さの新しいクラスを用意する準備ができている場合を除きます(単一のリンクされた文字リストのクラスを作成することは可能です。ジェネリックスを使用して長さをエンコードしますが、実際のシナリオでそれを使用したいとは思わないでしょう。

于 2011-01-21T17:01:33.110 に答える
2

私はあなたが何を達成したいのか100%確信していません。コンストラクターが異なるサイズの配列で呼び出されないようにしますか?コンパイル時に?実行時のチェックアンドスローが許容できるソリューションではないのはなぜですか?

依存性注入フレームワークが新しいBeanValidation標準をサポートしている場合、これにより注入中にチェックが行われます。

Foo(Bar injectedBar, @Size(min=5,max=5) char[] injectedFixedString)
于 2011-01-21T17:14:07.020 に答える
1

Javaプログラムで使用できずjava.lang.String、必要な場合にのみ配列に変換できます。を使用しtoCharArray()、その前の文字列を制限します(StringUtils.right(str, 5)たとえば、commons-langから使用)

IllegalArgumentExceptionまたは、5を超える長さの文字列がメソッドに渡されたときにをスローすることもできます。

于 2011-01-21T17:04:00.850 に答える
0

あなたが持つことができます

Foo(Bar injectedBar, char[] injectedFixedString)

そしてそれを

new Foo(injectedBar, new char[5])

また

Foo(Bar injectedBar, fixedStringLength)
new Foo(injectedBar, 5)

また、charは1バイトではなく2バイトであることにも注意してください。プロトコルは16ビット文字または8ビットを想定していますか。

于 2011-01-21T17:00:59.180 に答える