Лучшая практика: Как выставить ICollection только для чтения

Обработка сообщений строго связана с Android . Но на самом деле вы не хотите отправлять сообщение обработчику. На самом деле вы запускаете код только в этом потоке. Таким образом, вместо того, чтобы использовать сообщения, которые вы делаете, вы должны просто позвонить post(Runnable) :

val uiThreadHandler = Handler(Looper.getMainLooper())

uiThreadHandler.post {
    ...
}

Чтобы абстрагировать это еще дальше, вы можете использовать Kotlin Coroutines с расширением Android для Dispatchers.Main:

GlobalScrope.launch(Dispatchers.Main) {
    ...
}

Блок будет запланирован в главном потоке Android . Если вы ничего не приостанавливаете в самом блоке, что может иметь место из-за того, что вы не используете сопрограмм прямо сейчас, вам не нужно беспокоиться об отмене Job возвращается из launch.

10
задан Community 23 May 2017 в 12:08
поделиться

6 ответов

Похоже, я решил вернуть IEnumerable с клонированными объектами.

public IEnumerable<Foose> GetFooseList() {
   foreach(var foos in Collection) {
     yield return foos.Clone();
   }
}
  • требует метода Clone для Foos.

Это не позволяет изменять коллекцию. Помните, что ReadonlyCollection "дырявый", поскольку объекты внутри него могут быть изменены, как указано в ссылке в другом сообщении.

0
ответ дан 3 December 2019 в 21:24
поделиться

Можно сделать "foos" ReadOnlyCollection как это:

ReadOnlyCollection<T> readOnlyCollection = foos.ToList<T>().AsReadOnly();

Затем можно выставить его как свойство класса.

Править:

    class FooContainer
    {
        private ICollection<Foo> foos;
        public ReadOnlyCollection<Foo> ReadOnlyFoos { get { return foos.ToList<Foo>().AsReadOnly();} }

    }

Примечание: Необходимо помнить, что, после того как Вы получаете набор ReadOnlyFoos, больше не "синхронизируется" с Вашим foos ICollection. Посмотрите поток, на который Вы сослались.

15
ответ дан 3 December 2019 в 21:24
поделиться

Моя рекомендация состоит в том, чтобы возвратиться, используют ReadOnlyCollection <T> для сценария непосредственно. Это делает использование явным вызывающему абоненту.

Обычно я предложил бы использовать соответствующий интерфейс. Но, учитывая, что Платформа.NET в настоящее время не имеет подходящего IReadOnlyCollection, необходимо пойти с типом ReadOnlyCollection.

Также необходимо знать при использовании ReadOnlyCollection, потому что это не на самом деле только для чтения: Неизменность и ReadOnlyCollection

3
ответ дан 3 December 2019 в 21:24
поделиться

Иногда можно хотеть использовать интерфейс, возможно, потому что Вы хотите дразнить набор во время поблочного тестирования. См. мою запись в блоге для добавления Вашего собственного интерфейса к ReadonlyCollection при помощи адаптера.

0
ответ дан 3 December 2019 в 21:24
поделиться

Я обычно возвращаюсь IEnumerable<T>.

После того как Вы делаете набор только для чтения (так методы как Add, Remove и Clear больше работа), там не много остается, что набор поддерживает это, счетное не делает - просто Count и Contains, Я верю.

Если потребители Вашего класса действительно должны рассматривать элементы как, они находятся в наборе, достаточно легко передать IEnumerable кому: List<T>конструктор.

0
ответ дан 3 December 2019 в 21:24
поделиться

Возвратите T []:

private ICollection<T> items;

public T[] Items
{
    get { return new List<T>(items).ToArray(); }
}
-4
ответ дан 3 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: