基本上我想创建一个在编译时已知值的数据结构。在 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" ),
};
这显得麻烦且无效(当结构变得又长又复杂时)。还有别的办法吗?
(注意:请忽略任何语法错误,因为这只是为此问题创建的示例代码。另外,我知道字符串不是指向数据段的字符指针。但是,该参数适用于原始数据类型,如下所示好吧)。
你必须将 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" ),
};
}
除非有什么我没有得到的,否则这应该很简单:
Object[][] mylist = {{1, "first"}, {2, "second"}};
2024 年更新
有人赞成这个非常古老的答案。 Java 自 2012 年以来已经取得了进步,现在的答案看起来更像是:
record Linetype(int id, String descr){};
static List<Linetype> mylist = List.of(
new Linetype(1, "first"),
new Linetype(2, "second)
);
在Java中,不能在编译时创建数组(数组是特殊类型的对象)。使用静态块(或)运行时(作为实例变量)的类加载时间,您可以创建数组。
静态块示例:
class TestClass
{
static {
arr[0] = "Hi";
arr[1] = "Hello";
arr[2] = "How are you?";
}
....
}
如果您想避免使用新对象,您可以使用
Map
而不是数组。请注意,第一个值(1、2 等)始终必须是唯一的。请参阅 Map 的 Oracle 文档。
private static Map<Integer, String> myMap = new TreeMap<Integer, String>();
static {
myMap.put(1, "first");
myMap.put(2, "second");
}
如果数据结构真的非常混乱和复杂,并且您真的不想用它来“混乱”您的代码,您可以在一个完全独立的小程序中创建它,并将其序列化/保存到磁盘。你的“真正的”程序只是反序列化/读取它。
当然,这确实掩盖了正在发生的事情,所以我会避免这种技术,除非你真的需要它。
如果问题只是应用程序的初始加载速度很慢,您可以使用 Holder Pattern
推迟静态初始化器您可以使用 Java 中的静态块来初始化它们。
class Outer
{
static
{
// whatever code is needed for initialization goes here
}
}