2011-01-21 11 views
3

[コンテキスト:Java、4ヶ月新作; C++の古い手。]Javaの固定サイズ配列の代わりに?

私は多くの場所で固定サイズの配列( "固定ストリング")を必要とするライブラリに取り組んでいます。私は、この特定の問題のための依存性注入(q.v.)を使用しようとしているので、私は、フォームの何か希望:

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

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

シンプル必要ですが - これは、自動生成された通信プロトコルに起こっているの。私はそれが由来しているプロトコルとデータベースの制御をゼロにしています。最終的なコードには、これらのインスタンスが数千ではないにせよ数百もあるでしょう。カスタムクラスを作成するために

char injectedFixedString[5]; 

はC++への私の唯一の選択肢です:だから、すべてのことを与えられましたか?次のようなもの:

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]; 
    } 
} 

ありがとうございます。 (コードがあまりにも多すぎると私の謝罪です)。

+1

は答えを書いた後、私は実際にあなたがここで何をしようとして従っていません実現しました。何がFoo(Bar injectedBar、/ *ここに行くことができますか?*/char [5] injectedFixedString); 6文字の文字列を渡したらどうしますか?私がC++がどのように処理したかを知っていれば、おそらくあなたを助けることができます。 – Endophage

+0

OPはC++の固定サイズの配列の代替品を探しています。C++では以下のメソッド宣言が有効です: 'myMethod(char myarray [5])' – dogbane

+0

@dogbane:そしてその宣言は何ですか? –

答えて

2

あなたはすべての長さのために新しいクラスを持っているために用意されていない限り、あなたが静的に保証長でやりたいする方法は、確かにありません:FixedBarString4、FixedBarString5など(のためのクラスを作成することが可能です

+1

ありがとう、これは私が強制的に行く方法です。私の簡単なGoogle検索では、Bean ValidationとAndroidで有望なものは何も出てこなかった。 –

0

あなたは

Foo(Bar injectedBar, char[] injectedFixedString) 

を持っており、そのまた価値charは2つのバイトではなく、一つであることを指摘

new Foo(injectedBar, new char[5]) 

または

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

でそれを呼び出すことができます。あなたのプロトコルは16ビット文字または8ビットを想定していますか?

+0

@ peter-lawreyはい、コンストラクタでは渡される配列の長さが5であることを確認する必要があります。C++のように 'Foo(Bar injectBar、char injectedFixedString [5])'を宣言することはできません。 – dogbane

+0

私が必要とする実際の値は7ビットのASCIIですが、ネット(警告エンプトータ)によれば、Unicodeの最初の128個の値(0-127)はASCIIセットです。私は値を16ビットから7ビットにマスキングすることを計画しています。 –

+0

@ John、8ビットのバイト[]を使用する必要があります。 –

1

Javaプログラムでjava.lang.Stringを使用できず、それを配列に変換することはできませんか?必要な場合はtoCharArray()を使用し、その前に文字列を制限する(たとえば、コモンズランからStringUtils.right(str, 5)を使用)

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

+0

この特殊なケースでは、呼び出し側プログラマーがライブラリが_exactly_ "N"文字を期待していることを知る必要があります。サブセットを取ることは、この特定のプロトコルでは多すぎる問題を引き起こす。これは、たとえば、一意のID(私はコメントフィールドについてそれほど心配していない)かもしれません。たとえば、フィールドが6桁のIDの場合、実際には「12345678」はID「123456」、「234567」または「345678」になりますか?呼び出し元はどのようにこれをデバッグしますか?十分な文字ではないので、多くの場合、呼び出し側が望む結果を得ることができません。 IDの例では、 "123"は6桁のIDと一致しません。 –

+0

@John Price - 更新された – Bozho

2

私はあなたが達成したいことを100%確信していません。異なるサイズの配列でコンストラクタが呼び出されないようにしますか?コンパイル時に?なぜ、実行時に許容可能な解決策ではないことを確認する&のチェックですか?あなたの依存性注入フレームワークは新しいbean validation標準をサポートしている場合

、これは、注射時にあなたにチェックを得るでしょう:

Foo(Bar injectedBar, @Size(min=5,max=5) char[] injectedFixedString) 
+0

を参照してください。ターゲットプラットフォームはアンドロイドです(1.6、ただし2.2にアップグレードします)。 _それがサポートされていれば、うまくいくでしょう。 –

関連する問題