如何在java中初始化对象的静态数组

问题描述 投票:0回答:6

基本上我想创建一个在编译时已知值的数据结构。在 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" ),
    };

这显得麻烦且无效(当结构变得又长又复杂时)。还有别的办法吗?

(注意:请忽略任何语法错误,因为这只是为此问题创建的示例代码。另外,我知道字符串不是指向数据段的字符指针。但是,该参数适用于原始数据类型,如下所示好吧)。

java
6个回答
11
投票

你必须将 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" ),
    };
}

2
投票

除非有什么我没有得到的,否则这应该很简单:

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

1
投票

在Java中,不能在编译时创建数组(数组是特殊类型的对象)。使用静态块(或)运行时(作为实例变量)的类加载时间,您可以创建数组。

静态块示例:

class TestClass
{
     static {
     arr[0] = "Hi";     
     arr[1] = "Hello";     
     arr[2] = "How are you?"; 
    }
....
}

1
投票

如果您想避免使用新对象,您可以使用

Map
而不是数组。请注意,第一个值(1、2 等)始终必须是唯一的。请参阅 Map 的 Oracle 文档

private static Map<Integer, String> myMap = new TreeMap<Integer, String>();

static {
    myMap.put(1, "first");
    myMap.put(2, "second");
}

0
投票

如果数据结构真的非常混乱和复杂,并且您真的不想用它来“混乱”您的代码,您可以在一个完全独立的小程序中创建它,并将其序列化/保存到磁盘。你的“真正的”程序只是反序列化/读取它。

当然,这确实掩盖了正在发生的事情,所以我会避免这种技术,除非你真的需要它。

如果问题只是应用程序的初始加载速度很慢,您可以使用 Holder Pattern

推迟静态初始化器

-1
投票

您可以使用 Java 中的静态块来初始化它们。

class Outer
{
  static 
  {
    // whatever code is needed for initialization goes here
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.