Все стандартные коллекции имеют конструкторы копирования. Используйте их.
List original = // some list
List copy = new ArrayList(original); //This does a shallow copy
clone()
был спроектирован с несколькими ошибками (см. этот вопрос ), поэтому лучше его избегать.
Из Эффективное Java 2nd Edition , пункт 11: разумно отвергнуть клон
Учитывая все проблемы, связанные с Cloneable, можно с уверенностью сказать, что другие интерфейсы не должен расширять его, а классы, предназначенные для наследования (пункт 17), не должны его реализовывать. Из-за многих недостатков некоторые экспертные программисты просто не рекомендуют переопределять метод клонирования и никогда не вызывать его, кроме, возможно, для копирования массивов. Если вы создаете класс для наследования, имейте в виду, что если вы решите не предоставлять хорошо защищенный метод клонирования, для подклассов будет невозможно реализовать Cloneable.
В этой книге также описывается многие конструкторы копирования преимуществ имеют над Cloneable / clone.
- Они не полагаются на механизм создания экстралингвистического объекта, подверженного риску
- . Они не требуют неприемлемого соблюдения
- Они не противоречат правильному использованию конечных полей
- Они не выбрасывают ненужные проверенные исключения
- Они не требуют отбрасываний .
Рассмотрим другое преимущество использования конструкторов копирования: предположим, что у вас есть
HashSet s
, и вы хотите скопировать его какTreeSet
. Метод clone не может предложить эту функциональность, но с конструктором преобразования легко:new TreeSet(s)
.
есть способ, которым я могу просто «обновить» или «обновить» то, что находится в папке «Загрузки», чтобы они отображались с помощью приложения «Загрузки Android»?
blockquote>Приложение «Загрузки» показывает только то, что находится в его
ContentProvider
, что, в свою очередь, обусловлено тем, что было загружено черезDownloadManager
. Он не отображает содержимое какой-либо конкретной каталогов на устройстве и чтоContentProvider
не документирован или не поддерживается для независимого доступа.Я также попытался использовать медиа-сканер Intent (для обновления галерея), но, по моему мнению, это не работает для Marshmellow.
blockquote>Это или использование
MediaScannerConnection
иscanFile()
позволит приложениям, которые запрашиваютMediaStore
, чтобы видеть ваш файл. Сюда входит демон MTP; MTP - это то, как настольная ОС просматривает содержимое внешнего хранилища устройства Android. Ни одно из них напрямую не влияет на приложение «Загрузки».
Я этого не делаю без класса DownloadManager. Я использую следующее в AsyncTask
DownloadManager downloadManager = (DownloadManager)mainActivity.getSystemService(mainActivity.DOWNLOAD_SERVICE);
downloadManager.addCompletedDownload(file.getName(), file.getName(), true, "application/json", file.getAbsolutePath(),file.length(),true);
. Это заставит файл появиться в приложении «Загрузки» на 6.0, даже если файл был создан локально.