【问题标题】:How to initialize a final object array如何初始化最终对象数组
【发布时间】:2013-10-16 02:19:54
【问题描述】:

我正在尝试在我的类(MainActivity)中添加一个对象数组,例如

public class MainActivity extends Activity {
    private class A {
      A(String s) { ..}
    }
    private static final A[] aList1;
    private static final List<A> aList2;
    ...

我都可以。

但我不知道如何初始化aList1 或aList2。已经尝试过:

private static final A[] aList;
static {
    a = new A[2];
    a[0] = new A("emails");
}

也试过了:

private static final List<A> aList = new ArrayList<A>(){{
    add(new A("emails"));
}};

但日食抱怨:No enclosing instance of type MainActivity is accessible. Must qualify the allocation with an enclosing instance of type MainActivity (e.g. x.new A() where x is an instance of MainActivity).

如何解决这个问题?

【问题讨论】:

  • 什么是AMainActivity在哪里?
  • 听起来我们没有得到完整的故事。内部类是怎么回事?
  • @JeroenVannevel 更新了我的帖子
  • @Deqing 我已经更新了我的答案。我想我现在明白你的问题了。

标签: java arrays static initialization final


【解决方案1】:

ArrayList 比 List 好。它有更多的方法。示例:

private static final A[] aList2;
private static final ArrayList<A> aList = new ArrayList<A>(); //you can add in static aList=new ArrayList<a>();

....or...
static {
    aList = new ArrayList(a):
    aList.add(new A("emails"));
}

将数组转换为A[]:

A[] array = new A[aList.size()];
array = aList.toArray(array);

快速获取价值:

for (A item : aList) {
    ... do somme with item
}

获取任何项目:aList.get(int index);

【讨论】:

    【解决方案2】:

    我想我现在明白你的问题了。你有一个内部类A 在你的类MainActivity 中声明,对吧?好吧,在这种情况下,您将无法初始化您的 static final 变量,因为您需要一个 MainActivity 的实例来创建一个 A 的新实例。我建议你做的是让你的类A 一个静态类

    private static class A {
        // code here
    }
    

    这样你就可以实例化为

    A a = new MainActivity.A("someString");
    

    变量初始化为

    private static final A[] aList;
    
    static {
        a = new A[2];
        a[0] = new MainActivity.A("emails");
    }
    

    【讨论】:

    • 通过将我的内部类 A 声明为 static 解决了问题。顺便说一句,aList 是在MainActivity 内部定义的,所以可以使用A a = new A("emails");
    【解决方案3】:

    final 字段只能内联和在构造函数中初始化。

    private static final A[] aList = new A[2];
    

    之后你可以使用静态初始化器

    static {
     aList[0] = new A("emails");
    }
    

    或者用一个列表

    private static final List<A> aList = new ArrayList<>();
    
    static {
     aList.add(new A("example"));
    }
    

    【讨论】:

    • 看来我应该将构造函数添加到MainActivity 并将初始化程序放入其中?
    猜你喜欢
    • 2020-04-21
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多