我在Android上有一个设计问题。
我有一个类用于在Andriod中注册Accelerometer传感器。我将SensorEventListener作为参数传递给定义的函数,以便用户可以获得处理实时传感器数据的功能或使用POJO类存储它。
如果我在该类上实现Singleton设计模式会有什么影响?是否有任何阻碍从发展方面?
示例代码:
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
}
}
这个类我想用于应用程序开发。由于应用程序开发的同步方法,还有其他缺点吗?
答案 0 :(得分:0)
我一直在使用相同的方法,并且在您的类仅依赖于基本应用程序上下文的情况下,无法看到任何理由。
我发现这是一个简洁的方法,用于缓解我的活动和碎片,因为我需要在我的应用程序中的多个位置保存所需的代码逻辑。
如果你达到了以这种方式构造更多对象并且它们具有更复杂的依赖关系的点,事情会变得更加麻烦。如果在某些情况下需要活动上下文,例如显示对话框等,或者您需要具有内部依赖关系。
在我的情况下,我最终编写了一个Factory,它以正确的顺序构造了对象,并将依赖项作为参数。虽然工作变得非常烦人。想象一下,即使应用程序被破坏,也可以在后台运行一个服务,现在这些服务可以帮助您解决问题。对象已被构造并驻留在内存中再次消失。
我的解决方案是实施Dagger
使用这个我可以像这样构建对象
@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
}
这也适用于多个依赖项:
@Singleton
public class AnotherModule
{
@Inject
public AnotherModule(@ForActivity Context context, Accel acc, ThirdModule thridMod)
{
}
public registerListener(SensorEventListener listener)
{
// To Do
}
}
注意@ForActivity,这意味着该模块不能在模块中工作(因为我们依赖于存在的Activity上下文)
public {Activity, Fragment} {
@Inject AnotherModule anotherMod; <- anotherModis now constructed and ready for use
}
使用Dagger大大提高了代码的质量,因为它删除了设置模块所需的任何冗余和样板代码。
价格是起初工作有点困难,至少对我来说是这样。花了一周时间学习并应用~15k行代码,如前所述。如果你只需要一个单独的对象,那么这样做可能有点过分了:)
希望这对你有所帮助