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

您的数组包含 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 回答
1

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

对于您的扩展问题,ScalingData应该声明嵌套类static,否则,正如错误消息所说,它需要从它嵌套的类的封闭实例中创建,CustomConverter(或者您必须使用 operator new 调用这种类型的实例,如下所示:myCustomConverterInstance.new ScalingData(1.01f, "Data point 1", 1)- 但ScalingData不需要封闭类,只需将其声明为静态或将其声明为非嵌套类)。

如果您的数组有很多点并且您发现类的名称有点太长,作为速记,您可以创建一个名称非常短的辅助函数,它只创建一个实例。稍长的名称有利于可读性,但长数组的初始化有时可能是一个例外。在这个名字只是ScalingData的特殊情况下,收益并不大,但是对于一些类名,我确实发现这个解决方案可以使代码更好,特别是如果数组很长。这只是一个 hack,但它允许数组初始化代码更短并且可能更清晰:

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 回答
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 回答