目标:
我想为不经常更改的数据实现硬编码查找表,但是当它发生更改时,我希望能够快速更新程序并重建。
安排:
我的计划是定义一个自定义数据类型......
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;
}
}
}
答案 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;
}
}