Как инициализировать статический SparseArray

Как я могу инициализировать static немодифицируемый экземпляр android.util.SparseArray?

3 ответа

Решение

Вы не можете делать то, что вы пытаетесь. По крайней мере, не так, как вы пытаетесь это сделать. Там нет реализации SparseArray это невозможно изменить.

Тем не менее, вы можете создать один. Вот как:

  • Создать класс, скажем CustomSparseArray<E>и продлить SparseArray,
  • Переопределите все методы, которые изменяют элементы в массиве, и замените их чем-то вроде этого:

    @Override
    public void append(int key, E value) {
        if (mLocked)
            return; // Maybe throw an exception
        super.append(key, value);
    }
    
  • Затем добавьте переменную-член в класс, boolean mLocked = false;,
  • Далее вам нужен метод, подобный следующему:

    public void lock() { mLocked = true; }
    
  • Наконец, реализуйте вашу статическую переменную, используя метод, аналогичный тому, что описан в другом посте:

    public class Test {
        private static final CustomSparseArray<Integer> myArray;
        static {
            myArray = new CustomSparseArray<Integer>();
            myArray.append(1, 1);
            myArray.append(2, 5);
            myArray.lock();
        }
    }
    

Тогда у вас есть неизменяемое SparseArray в вашем static переменная myArray,

Вот лучший способ использования анонимного класса:

static final SparseIntArray myArray = new SparseIntArray() {
    {
        append(1, 2);
        append(10, 20);
    }
};

Это работает для меня:

static final SparseIntArray CMyArray = new SparseIntArray();
static {
    CMyArray.append(2, 4);
    CMyArray.append(8, 3);
    CMyArray.append(255, 1);
}

согласно: https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

Для неизменяемого экземпляра android.util.SparseArray вы можете использовать реализацию Google:

https://android.googlesource.com/platform/frameworks/base.git/+/master/services/core/java/com/android/server/hdmi/UnmodifiableSparseArray.java

Другие вопросы по тегам