Как Python закрывает файлы, которые были gc'ed?

Вам не нужно создавать свой компонент для каждого класса, в который вы хотите внедрить зависимости. Зависимости могут быть предоставлены через конструктор, помеченный @Inject:

public class PersonsRemoteRepository implements PersonsRepository {

    private RestClient restClient;

    @Inject
    public PersonsRemoteRepository(RestClient restClient) {
         this.restClient = restClient;
    }
}

И любой другой класс, которому нужен этот репозиторий, может сделать то же самое:

public class AnyOtherClass {
    private PersonsRemoteRepository personsRemoteRepository;

    @Inject
    public AnyOtherClass(PersonsRemoteRepository personsRemoteRepository) {
        this.personsRemoteRepository = personsRemoteRepository;
    }

Вам нужно только использовать [ 116] для классов, экземпляры которых создаются Android, таких как Приложение, Действия и Фрагменты.

public class MyActivity {
    @Inject PersonsRemoteRepository personsRemoteRepository;

    @Override
    public void onCreate() {
        super.onCreate();

        CoreApplication.getComponent().inject(this);
    }
}

Изменения, необходимые в вашем CoreApplication:

public class CoreApplication extends MultiDexApplication {
    private static ProjectApplicationComponent component;

    @Inject private RestClient restClient;
    @Inject private Picasso picasso;
    @Inject private Handler handler;

    @Override
    public void onCreate() {
        super.onCreate();

        ...
        component = DaggerProjectApplicationComponent.builder()
                .contextModule(new ContextModule(this))
                .networkServiceModule(new NetworkServiceModule(ClientSettings.SERVER_URL))
                .build();

        component.inject(this);
    }
}

Изменения, необходимые в вашем ApplicationComponent:

@ActivitiesScope
@Component(dependencies = ProjectApplicationComponent.class)
public interface ApplicationComponent {
    void inject(CoreApplication coreApplication);

    void inject(MyActivity myActivity);
}
15
задан SilentGhost 24 February 2009 в 14:04
поделиться

4 ответа

В CPython, по крайней мере, закрываются файлы, когда объект файла освобожден. Посмотрите file_dealloc функция в Objects/fileobject.c в источнике CPython. Методы Dealloc являются видом - подобных __del__ для типов C, кроме без некоторых проблем, свойственных к __del__.

20
ответ дан 1 December 2019 в 02:38
поделиться

Следовательно с оператором.

Для Python 2.5 использовать

from __future__ import with_statement

(Для Python 2.6 или 3.x ничего не сделайте),

with open( "someFile", "rU" ) as aFile:
    # process the file
    pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
4
ответ дан 1 December 2019 в 02:38
поделиться

Python использует подсчет ссылок и детерминированное разрушение в дополнение к сборке "мусора". Когда больше нет ссылок на объект, объект сразу выпущен. Выпуск файла закрывает его.

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

Обратите внимание, что подсчет ссылок не прекрасен. У Вас могут быть объекты с циклическими ссылками, который не достижим от проножки. Вот почему Python имеет сборку "мусора" в дополнение к подсчету ссылок.

3
ответ дан 1 December 2019 в 02:38
поделиться

Лучшее предположение - то, что, потому что типом файла является встроенный тип, сам интерпретатор обрабатывает закрытие файла на сборке "мусора".

С другой стороны, Вы только проверяете после того, как интерпретатор Python вышел, и все "пропущенные" дескрипторы файлов закрываются так или иначе.

0
ответ дан 1 December 2019 в 02:38
поделиться
Другие вопросы по тегам:

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