2

Animalというインターフェースがあります。これには 2 つの実装があります。犬と猫。Animal をさまざまなオブジェクトに注入するときに必要な実装を指定したかったので、次のようにして Hilt で解決しました。

@Module
@InstallIn(ApplicationComponent.class)
public abstract class ApplicationModule 
{

    @Named("Dog")
    @Binds
    public abstract Animal provideDog(Dog dog);

    @Named("Cat")
    @Binds
    public abstract Animal provideCat(Cat cat);
 
}

Dog および Cat コンストラクターには @Inject アノテーションが付けられています。

public class Dog implements Animal
{

    @Inject
    public Dog()
    {
                  
    }
}

public class Cat implements Animal
{

    @Inject
    public Cat()
    {
                  
    }
}

C という別のクラスが Dog オブジェクトを必要とする場合:

public class C
{
    
        @Inject
        public C(@Named("Dog")Animal dog)
        {
                      
        }
}

D という別のクラスが Cat オブジェクトを必要とする場合:

public class D
{
    
        @Inject
        public D(@Named("Cat")Animal cat)
        {
                      
        }
}

アプリを実行すると、Hilt は常に同じ犬のインスタンスを挿入することに気付きました。つまり、その犬のインスタンスは、クラス C の異なるインスタンス間で共有されます。クラスのインスタンスごとに犬の新しいインスタンスが必要な場合はどうすればよいですかC?

簡潔にするために、フィールドのコードは追加しませんでした。

4

0 に答える 0