我有什么令人信服的理由来解释这种方法吗?

时间:2012-03-17 21:37:23

标签: android

我有这个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()之前实例化该类吗?

3 个答案:

答案 0 :(得分:2)

没有理由将其静音。这个方法不需要任何类的“状态”,因为它显然是一个实用类,所以 应该是静态的。

如果它确实是一个实用程序类,您应该通过禁止实例化来强制执行它:将默认构造函数设为私有:

private oDaA_DBUtils {
    // no instances allowed!
}

此外,遵循Java命名标准是一种很好的做法:对于类名称使用大写的camelcase,对于方法使用非大写的camelcase。从长远来看,这将帮助您在查看代码时乍一看您正在做的事情。

public class OdaaDbUtils
public static void saveCheckedStateToDb(....)

答案 1 :(得分:2)

避免许多静态方法的一个很好的理由是可测试性。静态方法通常使单元测试非常困难和痛苦。使用带接口的类实例(例如结合依赖注入)通常是一个不错的选择。但是,有些情况,例如工厂和实用程序类,静态方法和枚举类是很好的选择。

答案 2 :(得分:1)

你可以使用静态函数,其中

  1. 您不需要该函数中的非静态类成员或方法。

  2. 当此函数以某种方式作为工厂函数时,您正在尝试创建并返回类的对象。 (所以没有对象可以称之为!)

  3. 当你编写静态函数时要注意它不会继承。 因此,当您编码时,不是您决定它的东西!这是系统的第一次分析和建模的问题。如果你使用许多静态方法,整个OO概念将被破坏!

    我需要更多地了解这个函数的机制及其类以获得更好的答案。 但是你说代码符合的任何方式,因此该函数中没有成员变量,如果你的系统中没有继承或多态问题,你可以使它成为静态。