如何使用硬编码值声明自定义数据类型的静态数组?

时间:2012-05-07 20:58:48

标签: java static-array

目标:

我想为不经常更改的数据实现硬编码查找表,但是当它发生更改时,我希望能够快速更新程序并重建。

安排:

我的计划是定义一个自定义数据类型......

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

5 个答案:

答案 0 :(得分:6)

你不能用Java做到这一点。您需要像这样使用构造函数:

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

答案 1 :(得分:1)

您的数组包含ScalingData,因此您必须添加其实例。

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

顺便说一句:除非你真的需要,否则我不会使用float代替double。大多数时候具有额外的精度比你保存的几个字节更有用。

答案 2 :(得分:1)

正如其他人已经写过的那样,您需要显式创建对象的实例,即您的数组需要new ScalingData(1.01f, "Data point 1", 1)而不是{1.01f, "Data point 1", 1}等项目。这是语言语法的问题。

对于扩展问题,嵌套类ScalingData应该声明为static,否则,就像错误消息所说的那样,它需要在它嵌套的类的封闭实例中创建in,CustomConverter(或者您必须使用此类型的实例调用operator 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(大写首先是类)。

答案 3 :(得分:0)

你不能指望一些随机数据神奇地转换成一个对象。

您需要实例化ScalingData对象。

答案 4 :(得分: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;
    }
}