【问题标题】:Best practices to define constants used in an app定义应用程序中使用的常量的最佳实践
【发布时间】:2016-07-13 10:01:03
【问题描述】:

我在声明 JOIN 查询的 provider 包中有一个 ContentProvider:

final String ALL_DATA_FOR_AN_ANIMAL = "SELECT " +
        "animals._id, "
        + COLUMN_NAME + " AS _name, "
        + COLUMN_CLASSE + " AS _class, "
        + "IFNULL(" + COLUMN_OVERRIDE_INDIVIDU_NUMBER + ", " +  COLUMN_INDIVIDU_NUMBER + ")"  + " AS _ind_nb, "
        + "FROM " + ANIMALS_TABLE_NAME + " LEFT JOIN " + ANIMALS_OVERRIDE_TABLE_NAME
        + " ON " + COLUMN_NAME + " = " + COLUMN_OVERRIDE_NAME
        + " WHERE animals._id = ?";

使用 AS 定义的所有 sql 别名都用于 ContentResolver(在 operations 包中)来定义传递给 ContentProvider 中查询的投影和选择

String[] projection = new String[]{"_name", "_class", "_ind_nb", "_in_danger"};
String selection = "_id";
String[] selectionArgs = {selectionArg};

return mCr.query(uri, projection, selection, selectionArgs, sortOrder);

最后在view包中使用别名来显示查询结果

        tv_Name.setText(cursor.getString(cursor.getColumnIndex("_name")));
        tv_Class.setText(cursor.getString(cursor.getColumnIndex("_class")));
        //...

我认为在 Constants 类中定义别名比使用硬编码字符串更好,但我已经在包 ui 中为 ui 声明了一些常量。实用程序

最佳做法是什么?为整个应用编写一个 Constants 类专业包还是编写一个 Constants 类更好? (.. 或者通过不同的包使用这些别名是不良架构的标志?)

更新

下面是我为gui实现的Constants类,这个类在包view.utils

public class Constants {
    public static final int ANIMAL_PAGE_POS = 0;
    public static final int CARACTERISTICS_PAGE_POS = 1;
    //...
}

我也会对别名做同样的事情,比如:

public class Constants {
    public static final String ALIAS_ID = "_id";
    public static final String ALIAS_NAME = "_name";
    //...
}

问题是:

  • 在不同的包之间共享变量(特别是别名)是否是一个好的解决方案?
  • (如果第一个问题的答案是肯定的)我是否必须创建多个类似常量的类,或者在单个常量类中为所有包定义所有常量是否是一种好习惯?

【问题讨论】:

  • 所以你想使用不可编辑的字符串?
  • 如果是,将它们设置为最终。 public static final String ...
  • 您可以编写一个包含所有列名和方法的 Provider 合同来为您的提供者生成 URI,并使用 this lib 或类似的东西来生成查询
  • cursor.getString(cursor.getColumnIndex("_name")) 听起来像 cursor.getString("_name")cursor.getString(XXX_NAME),更安全的选择是 record.getName()
  • 这个问题Storing configs in android对你有帮助。

标签: java android constants


【解决方案1】:

有一件事我忘了说,我定义了一个类 Contract ,其中定义了所有表。正如@Sourabh 建议的那样,我使用这个类来定义 JOIN 查询所需的常量

public static final class JoinEntry implements BaseColumns {

    public static final String COLUMN_JOIN_NAME = "_name";
    public static final String COLUMN_JOIN_CLASS = "_class";
    public static final String COLUMN_JOIN_SUB_CLASS = "_sub_class";
    public static final String COLUMN_JOIN_NB_IND = "_ind_nb";
}

【讨论】:

  • 这应该是对原始问题的编辑,而不是答案。绝对不应该是公认的答案,因为它实际上并没有回答任何问题。
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 2012-05-15
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2015-06-11
相关资源
最近更新 更多