【问题标题】:can I read public static final field inside a nested public static abstract class in Java我可以在 Java 中读取嵌套的公共静态抽象类中的公共静态最终字段吗
【发布时间】:2015-05-19 10:01:06
【问题描述】:

不久前,我在我的 Android 应用程序中创建了一个 SQLiteHelper 类。我不是 100% 确定为什么,但是表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但是我的应用程序开始变得复杂,我想用公共静态最终表和列名字段填充其他类中的字段。经过反复试验,阅读了抽象类、静态类和嵌套类,我突然想到可以直接调用该字段,如下所示。

String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;

尽管我已经阅读了这些主题,但在我的具体案例中它们是如何结合在一起的,仍然让我摸不着头脑。所以我的问题是,既然字段是静态最终的,嵌套字段是否真的提供了额外的保护,如果嵌套类是静态的,为什么还要让它抽象呢?是否需要 static AND abstract 直接调用而不需要实例化外部和嵌套类?

感谢您的帮助。我真的很想了解各种类的实现。

这是该类的关键元素:

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
    }

}

【问题讨论】:

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


    【解决方案1】:

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

    不,它没有。如您所见,即使字段是嵌套的,您也可以访问它们,而且由于它们是静态的和最终的,您无法修改它们。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      不知道,这是你的课。

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

      不,static 就足够了。

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

      【讨论】:

      • 这不完全是我的代码。它源自一个关于 Android 数据库的网站的示例。我所有的问题都与样本的组织方式有关,而我对样本的困惑是提出问题的原因。
      • 嗯,这肯定不是 我的 代码,我当然无法回答有关作者为何使用abstract, 的问题,无论他是谁。其他人也不是。
      • 是的,我现在明白这似乎没有意义。所以从这个意义上说,你回答了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多