Android 对于库文件,Singleton类的效果

Android 对于库文件,Singleton类的效果,android,Android,我有一个关于Android的设计问题 我有一个类,用于在Andriod中注册加速计传感器。我将SensorEventListener作为参数传递到定义的函数中,以便用户获得处理实时传感器数据或使用POJO类存储数据的功能 如果我在那个类上实现一个单例设计模式,会有什么影响?开发侧是否有任何堵塞 示例代码: public class Accel { private static Accel accelObj; private Accel(Context context) {

我有一个关于Android的设计问题

我有一个类,用于在Andriod中注册加速计传感器。我将SensorEventListener作为参数传递到定义的函数中,以便用户获得处理实时传感器数据或使用POJO类存储数据的功能

如果我在那个类上实现一个单例设计模式,会有什么影响?开发侧是否有任何堵塞

示例代码:

public class Accel
{
    private static Accel accelObj;
    private Accel(Context context)
    {

    }
    public static synchronized Accel getInstance(Context context) 
    {
        if (accelObj == null)
        accelObj = new Accel(context);

    return accelObj;
    }
    public registerListener(SensorEventListener listener)
    {
     // To Do
    }
}

这个类我想用于应用程序开发。除了由于应用程序开发的同步方法而变得更慢之外,还有什么缺点吗?

我一直在使用相同的方法,对于您的类仅依赖于基本应用程序上下文的情况,我看不出有任何理由认为这是个坏主意

我发现它是一种很好的方法,可以减轻我的活动和在应用程序的多个地方保存所需代码逻辑的麻烦

如果有更多的对象以这种方式构造,并且它们具有更复杂的依赖关系,那么事情就会变得更麻烦。如果在某些情况下需要活动上下文,例如显示对话框等,或者需要具有内部依赖关系

在我的例子中,我最终编写了一个工厂,它以正确的顺序构造对象,并将依赖项作为参数。虽然工作,但维护它变得非常烦人。想象一下,即使应用程序被破坏,也可以在后台运行一项服务,现在,对象已经构建并驻留在内存中的“保证”再次消失

我的解决办法是实施

使用这个,我可以像这样构造对象

@Singleton
public class Accel
{
    @Inject
    public Accel(@ForApplication Context context)
    {

    }

    public registerListener(SensorEventListener listener)
    {
     // To Do
    }
}
现在,在我需要应用程序中的Accel对象的任何位置:

public {Activity, Fragment, Service} {

    @Inject Accel acc; <- acc is now constructed and ready for use

}
请注意@ForActivity,这意味着此模块将无法在模块中工作,因为我们依赖于存在的活动上下文

public {Activity, Fragment} {

    @Inject AnotherModule anotherMod; <- anotherModis now constructed and ready for use

}
使用Dagger极大地提高了代码的质量,因为它删除了设置模块所需的任何冗余和样板代码

代价是开始工作有点困难,至少对我来说是这样。如前所述,花了一周时间学习和应用约15k行代码。如果您只需要一个单例对象,那么这样做可能有点过分:

希望这对你有帮助

public {Activity, Fragment} {

    @Inject AnotherModule anotherMod; <- anotherModis now constructed and ready for use

}