4

ゴール:

頻繁に変更されないデータのハードコードされたルックアップテーブルを実装したいのですが、変更された場合は、プログラムをすばやく更新して再構築できるようにしたいと思います。

プラン:

私の計画は、そのようなカスタムデータ型を定義することでした...

private class ScalingData
{
    public float mAmount;
    public String mPurpose;
    public int mPriority;

    ScalingData(float fAmount, String strPurpose, int iPriority)
    {
        mAmount = fAmount;
        mPurpose = strPurpose;
        mPriority = iPriority;
    }
}

次に、メインクラスで、配列を次のようにハードコーディングします...

public static ScalingData[] ScalingDataArray =
{
        {1.01f, "Data point 1", 1},
        {1.55f, "Data point 2", 2}
};

ただし、これは構築されません。「」というメッセージが表示され続けますType mismatch: cannot convert from float[] to ScalingData

どうすれば目標を達成できますか?

アップデート

これまでに提案を実装しようとしましたが、それでもエラーが発生します...

コードは次のようになります。

public class CustomConverter
{
    //Lookup Table
    private static ScalingData[] ScalingDataArray =
    {
        new ScalingData(1.01f, "Data point 1", 1),
        new ScalingData(1.55f, "Data point 2", 2)
    };


    //Constructor
    CustomConverter()
    {
        //does stuff
    }


    //Custom Data type
    private class ScalingData
    {
        public float mAmount;
        public String mPurpose;
        public int mPriority;

        ScalingData(float fAmount, String strPurpose, int iPriority)
        {
            mAmount = fAmount;
            mPurpose = strPurpose;
            mPriority = iPriority;
        }
    }
}

ハードコードされた配列のエラーは

No enclosing instance of type CustomConverter is accessible.
   Must qualify the allocation with an enclosing instance of type CustomConverter
   (e.g. x.new A() where x is an instance of CustomConverter).

編集...以下の回答に従って完全なソリューション

public class CustomConverter
{
    //Lookup Table
    private static ScalingData[] ScalingDataArray =
    {
        new ScalingData(1.01f, "Data point 1", 1),
        new ScalingData(1.55f, "Data point 2", 2)
    };


    //Constructor
    CustomConverter()
    {
        //does stuff
    }


    //Custom Data type
    private static class ScalingData
    {
        public float mAmount;
        public String mPurpose;
        public int mPriority;

        ScalingData(float fAmount, String strPurpose, int iPriority)
        {
            mAmount = fAmount;
            mPurpose = strPurpose;
            mPriority = iPriority;
        }
    }
}
4

5 に答える 5

6

Javaではそれができません。次のようにコンストラクタを使用する必要があります。

public static ScalingData[] ScalingDataArray =
{
        new ScalingData(1.01f, "Data point 1", 1),
        new ScalingData(1.55f, "Data point 2", 2)
};
于 2012-05-07T21:01:04.783 に答える
1

他の人がすでに書いているように、オブジェクトのインスタンスを明示的に作成する必要があります。つまり、配列にはnew ScalingData(1.01f, "Data point 1", 1)の代わりに などの項目が必要です{1.01f, "Data point 1", 1}。それは言語の構文の問題です。

拡張された質問については、ネストされたクラスScalingDataを宣言staticする必要があります。それ以外の場合は、エラー メッセージに示されているように、ネストされているクラスの外側のインスタンス内から作成する必要がありますCustomConverter(または、演算子 new を使用して呼び出す必要があります)。このタイプのインスタンス、次のように: myCustomConverterInstance.new ScalingData(1.01f, "Data point 1", 1)- ただしScalingData、囲んでいるクラスは必要ありません。静的に宣言するか、ネストされていないクラスとして宣言するだけです)。

配列に多くのポイントがあり、クラスの名前が少し長すぎる場合は、省略形として、インスタンスを作成するだけの非常に短い名前のヘルパー関数を作成できます。少し長い名前は可読性に優れていますが、長い配列の初期化は例外になる場合があります。名前がちょうど であるこの特定のケースではScalingData、ゲインは大きくありませんが、いくつかのクラス名では、特に配列が長い場合、コードを改善するためにこのソリューションを見つけました。これは単なるハックですが、配列の初期化コードを短くして読みやすくすることができます。

protected static ScalingData point(float fAmount, String strPurpose, int iPriority) {
    return new ScalingData(fAmount,strPurpose,iPriority);
}

public static ScalingData[] ScalingDataArray = {
    point(1.01f, "Data point 1", 1),
    point(1.55f, "Data point 2", 2),
    ...
};

それ以外の

public static ScalingData[] ScalingDataArray = {
    new ScalingData(1.01f, "Data point 1", 1),
    new ScalingData(1.55f, "Data point 2", 2),
    ...
};

余談ですが、通常は Java の命名規則に従うことをお勧めします。つまり、配列の名前は小文字で開始する必要がありscalingDataArrayますScalingDataArray(最初に大文字を使用するのはクラスの名前です)。

于 2012-05-07T23:20:04.283 に答える
1

配列には ScalingData が含まれているため、それらのインスタンスを追加する必要があります。

public static ScalingData[] ScalingDataArray = {
        new ScalingData(1.01f, "Data point 1", 1),
        new ScalingData(1.55f, "Data point 2", 2)
};

ところで:本当に必要でない限り、float代わりに使用しません。doubleほとんどの場合、余分な精度を持つことは、保存する数バイトよりも便利です。

于 2012-05-07T21:01:10.700 に答える
0

ランダムなデータが魔法のようにオブジェクトに変換されることは期待できません。

ScalingData オブジェクトをインスタンス化する必要があります。

于 2012-05-07T21:01:35.070 に答える
0

列挙型の方がニーズに適していると思います:

enum ScalingData{

    DataPoint1(1.01f, "Data Point 1", 1),
    DataPoint2(1.55f, "Data Point 2", 2);

    final float Amount;
    final String Purpose;
    final int Priority;

    ScalingData(float fAmount, String strPurpose, int iPriority){
        Amount = fAmount;
        Purpose = strPurpose;
        Priority = iPriority;
    }
}
于 2012-05-07T21:55:09.953 に答える