У меня этот класс действует как синглтон (экземпляр не защищен для повторного создания):
class FooInteractorFactory(private val someEvent: SomeEvent) {
companion object {
lateinit var fooFactory: FooInteractorFactory
fun initialize(someEvent: SomeEvent) {
fooFactory = FooInteractorFactory(someEvent)
}
}
fun createSomeObject(): SomeObject {
return SomeObject(someEvent)
}
}
Этот «синглтон» инициализируется внутри этого класса:
class FooImpl : SomeEvent {
init {
FooInteractorFactory.initialize(this)
}
...
}
И FooImpl
создается в функции жизненного цикла onCreate()
в Деятельности:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val foompl = FooImpl()
}
...
}
Мой вопрос здесь FooInteractorFactory
, SomeEvent
или SomeObject
, некоторые из них будутутечка или нет права на сбор мусора?
Как сказано в документации,
Класс или интерфейс могут быть выгружены тогда и только тогда, когда сборщик мусора может вернуть их определяющий загрузчик классов.
это будет иметь право, НО, я не уверен.Я просто добавляю в приложение LeakCanary, но утечки никогда не было.
Я хочу быть уверен, основываясь на опыте каждого из вас.
РЕДАКТИРОВАТЬ
Вот как FooInteractorFactory
выглядит в декомпилированном коде Java:
public final class FooInteractorFactory {
private final SomeEvent someEvent;
@NotNull
public static FooInteractorFactory fooFactory;
@NotNull
public final FooInteractorFactory createSomeObject() {
return new SomeObject(this.someEvent);
}
public FooInteractorFactory(@NotNull SomeEvent someEvent) {
this.someEvent = someEvent;
}
public static final class Companion {
@NotNull
public final FooInteractorFactory getFooFactory() {
return FooInteractorFactory.access$getFooFactory$cp();
}
public final void setFooFactory(@NotNull FooInteractorFactory var1) {
FooInteractorFactory.fooFactory = var1;
}
public final void initialize(@NotNull SomeEvent someEvent) {
((FooInteractorFactory.Companion)this).setFooFactory(new FooInteractorFactory(someEvent));
}
}
}
FooInteractorFactory
является статической ссылкой того же класса.