我有这个SaveCheckedStateToDB()函数:
public class oDaA_DBUtils {
// TOOD: Perhaps this should not be static, and I should force callers to instantiate the class first?
public static void SaveCheckedStateToDB(int AOptionSelected, String id, boolean AToggledOn)
{
//
}
}
...在添加“static”关键字之前,我从静态调用它后改为“静态”:
cbOnDemand.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
// Contact id is a string?
oDaA_DBUtils.SaveCheckedStateToDB(oDaA_Consts.ALERT_ON_DEMAND, id, isChecked);
}
});
现在它编译,但这是一种“错误的”工作方式吗?我应该删除“静态”附加/装饰并强制调用者在调用SaveCheckedStateToDB()之前实例化该类吗?
答案 0 :(得分:2)
没有理由将其静音。这个方法不需要任何类的“状态”,因为它显然是一个实用类,所以 应该是静态的。
如果它确实是一个实用程序类,您应该通过禁止实例化来强制执行它:将默认构造函数设为私有:
private oDaA_DBUtils {
// no instances allowed!
}
此外,遵循Java命名标准是一种很好的做法:对于类名称使用大写的camelcase,对于方法使用非大写的camelcase。从长远来看,这将帮助您在查看代码时乍一看您正在做的事情。
public class OdaaDbUtils
public static void saveCheckedStateToDb(....)
答案 1 :(得分:2)
避免许多静态方法的一个很好的理由是可测试性。静态方法通常使单元测试非常困难和痛苦。使用带接口的类实例(例如结合依赖注入)通常是一个不错的选择。但是,有些情况,例如工厂和实用程序类,静态方法和枚举类是很好的选择。
答案 2 :(得分:1)
你可以使用静态函数,其中
您不需要该函数中的非静态类成员或方法。
当此函数以某种方式作为工厂函数时,您正在尝试创建并返回类的对象。 (所以没有对象可以称之为!)
当你编写静态函数时要注意它不会继承。 因此,当您编码时,不是您决定它的东西!这是系统的第一次分析和建模的问题。如果你使用许多静态方法,整个OO概念将被破坏!
我需要更多地了解这个函数的机制及其类以获得更好的答案。 但是你说代码符合的任何方式,因此该函数中没有成员变量,如果你的系统中没有继承或多态问题,你可以使它成为静态。