基本上我想创建一个在编译时已知的值的数据结构。在C中我会这样做:
struct linetype { int id; char *descr; };
static struct linetype mylist[] = {
{ 1, "first" },
{ 2, "second" }
};
我在Java中发现的唯一灵魂涉及在运行时创建数组:
public class Outer {
public class LineType {
int id;
String descr;
private LineType( int a, String b) {
this.id = a;
this.descr = b;
}
}
LineType[] myList = {
new LineType( 1, "first" ),
new LineType( 2, "second" ),
};
这看起来很麻烦且无效(当结构变得漫长而复杂时)。还有另外一种方法吗?
(注意:请忽略任何语法错误,因为这只是为这个问题创建的示例代码。另外,我知道String是指向数据段的字符指针以外的其他东西。但是,该参数适用于原始数据类型)。
答案 0 :(得分:8)
您必须使LineType成为静态类:
public class Outer {
public static class LineType {
int id;
String descr;
private LineType( int a, String b) {
this.id = a;
this.descr = b;
}
}
static LineType[] myList = {
new LineType( 1, "first" ),
new LineType( 2, "second" ),
};
}
答案 1 :(得分:2)
除非有一些我没有得到的东西,否则这应该是这样简单:
Object[][] mylist = {{1, "first"}, {2, "second"}};
答案 2 :(得分:1)
在Java中,您无法在编译时创建数组(数组是特殊类型的对象)。使用静态块(或)运行时(作为实例变量)的类加载时间可以创建数组。
静态块示例:
class TestClass
{
static {
arr[0] = "Hi";
arr[1] = "Hello";
arr[2] = "How are you?";
}
....
}
答案 3 :(得分:1)
如果要避免使用新对象,可以使用Map
而不是数组。请注意,第一个值(1,2等)总是必须是唯一的。请参阅the Oracle documentation for Map。
private static Map<Integer, String> myMap = new TreeMap<Integer, String>();
static {
myMap.put(1, "first");
myMap.put(2, "second");
}
答案 4 :(得分:0)
如果数据结构确实非常麻烦和复杂,并且你真的不想“混乱”你用它编码,你可以在一个完全独立的小程序中创建它,并将其序列化/保存到磁盘。你的“真实”程序只是反序列化/读取它。
当然,这确实模糊了正在发生的事情,所以除非你确实需要,否则我会避免这种技术。
如果问题只是应用程序的初始加载速度很慢,您可以使用Holder Pattern推迟静态初始化程序
答案 5 :(得分:-1)
您可以使用static blocks in Java初始化它们。
class Outer
{
static
{
// whatever code is needed for initialization goes here
}
}