我可以在Java中嵌套的公共静态抽象类中读取public static final字段

时间:2015-03-17 04:20:58

标签: java android oop android-sqlite abstract-class

不久前,我在Android App中创建了一个SQLiteHelper类。我不是100%确定原因,但表名和列名是嵌套公共静态抽象类中的公共静态最终字段。我记得,目标是保护领域不被修改。这一切都很好用但我的应用程序开始变得复杂,我想用其他公共静态最终表和列名字段填充其他类中的字段。经过一些试验和错误,并阅读有关抽象类,静态类和嵌套类之后,我发现它可以直接调用该字段,如。

String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;

即使我已经阅读过这些主题,但在我的具体案例中如何将它们结合在一起仍然让我感到头疼。所以我的问题是,由于字段是静态final,嵌套字段实际上是否提供了额外的保护,如果嵌套类是静态的,为什么还要使它抽象?是否需要静态和抽象来直接调用它而不需要实例化外部和嵌套类?

感谢您的帮助。我真的试图让我的脑袋围绕各种类实现。

这是班级的关键要素:

public class MySQLiteHelper extends SQLiteOpenHelper {


    private static final String DATABASE_NAME = "Reminders.db";
    private static final int DATABASE_VERSION = 5;
    public int DatabaseVersion = DATABASE_VERSION;

    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public static abstract class dbFields implements BaseColumns {

        //dbFields Table Fields
        public static final String TABLE_NAME_REMINDER = "reminders";
        public static final String COLUMN_REMINDER_ID = _ID;
        public static final String COLUMN_REMINDER = "reminder";
        public static final String COLUMN_REMINDER_ALTITUDE = "altitude";
        public static final String COLUMN_REMINDER_USED = "is_used";
        public static final String COLUMN_REMINDER_LASTUSED = "last_used";
        public static final String COLUMN_REMINDER_ACTION = "action";
        public static final String COLUMN_REMINDER_SCORE = "score";
        public static final String COLUMN_REMINDER_RELATIONSHIP = "relationship";

        //Special_Days Table Fields
        public static final String TABLE_NAME_SPECIAL_DAYS = "special_days";
        public static final String COLUMN_SPECIAL_DAYS_ID = _ID;
        public static final String COLUMN_SPECIAL_DAYS_DATE = "date";  //dbDataRow strField 1
        public static final String COLUMN_SPECIAL_DAYS_NAME = "name"; //dbDataRow dbData
        public static final String COLUMN_SPECIAL_DAYS_ALTITUDE = "altitude"; //dbDataRow intField 1
        public static final String COLUMN_SPECIAL_DAYS_USED = "is_used"; //dbDataRow Field 2
        public static final String COLUMN_SPECIAL_DAYS_WARNING = "warning"; //dbDataRow intField 3
        public static final String COLUMN_SPECIAL_DAYS_ACTION = "action"; //dbDataRow intField 4
    }

}

2 个答案:

答案 0 :(得分:1)

  

由于字段是静态final,嵌套字段实际上提供了额外的保护

如果嵌套类是公开的,则不会:它只是提供了一个符号上的不便。

  

如果嵌套类是静态的,为什么还要将它抽象化?

不知道,这是你的班级。

  

是否需要使用static和abstract直接调用它而不需要实例化外部和嵌套类?

不,static就足够了。

我也不认为这里有BaseColumns接口。我会认真考虑使用Enum作为列名。

答案 1 :(得分:1)

  

由于字段是静态final,嵌套字段实际上提供了额外的保护

不,它没有。正如您所见,即使它们是嵌套的,您也可以访问这些字段,因为它们是静态的和最终的,所以您无法修改它们。

  

如果嵌套类是静态的,为什么还要将它抽象化?是否需要静态和抽象来直接调用它而不需要实例化外部和嵌套类?

abstract的目的是允许您拥有一个没有实现的方法的基类。一个经典的例子是Animal类。所有的动物都会产生噪音(可能没有,但是让我们假装),所以Animal类应该有一个makeNoise方法。但是,每个动物的噪音都不同,因此在基类中进行任何实现都没有意义。 Cat子类可能看起来像public String makeNoise() { return "meow"; }Dog子类可能返回“woof”,但基类上没有makeNoise的合理实现。但是,如果您在基类上没有任何makeNoise,则无法向任意动物询问makeNoise。所以你在基础上有一个public abstract String makeNoise()方法。这样,即使您拥有的只是对makeNoise的引用,也可以为任何动物调用Animal

请注意,abstract与嵌套的类无关。嵌套或不嵌套的其他类可以从嵌套的静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关。

所以,回答你的问题:当且仅当抽象的目的适用于此时,你才应该将其抽象化。鉴于您的示例代码,它没有。

相关问题