Best practices to define constants used in an app

北战南征 提交于 2020-01-05 05:20:09

问题


I have a ContentProvider in a provider package where a JOIN query is declared:

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 = ?";

All the sql aliases defined with AS are used in a ContentResolver (in an operations package) to define projection and selection passed to the query in the 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);

Finally the aliases are used to display the result of the query in the view package

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

I think it would be better to define the aliases inside a Constants class instead of using hard-coded Strings, but I already have some constants declared for the ui in a package ui.utils.

What are the best practices? Is it better to write one Constants class pro package or to write a single Constants class for the entire app ? (.. or using these aliases through different package is a sign of bad architecture?)

update

Below is the Constants class I implemented for the gui, this class is in the package view.utils

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

I would do the same for the aliases, something like:

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

The questions are:

  • is it a good solution to share variables (specifically aliases) across different packages?
  • (if answer to first question is yes) do I have to create multiple Constants-like class or is it a good practices to define all constants for all package inside a single Constants class?

回答1:


One thing I forgot to say it that I defined a class Contract where all tables are defined. As @Sourabh suggested I used this class to define the constants I need for the JOIN query

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";
}


来源:https://stackoverflow.com/questions/38348454/best-practices-to-define-constants-used-in-an-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!