有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗

所以不久前,我在Android应用程序中创建了一个SQLiteHelper类。我不完全确定原因,但表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但我的应用程序开始变得复杂起来,我想用公共静态final table和column name字段填充其他类中的字段。经过一些尝试和错误,阅读了有关抽象类、静态类和嵌套类的内容后,我突然想到可以直接调用字段,如中所示

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
    }

}

共 (1) 个答案

  1. # 1 楼答案

    since the fields are static final, does nesting the fields actually provide additional protection

    不,它不是。正如你所看到的,你可以访问这些字段,即使它们是嵌套的,因为它们是静态的和最终的,你不能修改它们

    and if the nested class is static, why also make it abstract? Is static AND abstract required to call it directly without needing to instantiate the outer and nested classes?

    抽象的目的是让你有一个基类,它有一个没有实现的方法。一个典型的例子是动物类。所有动物都会发出噪音(可能不会,但让我们假装一下),所以动物类应该有一个makeNoise方法。但是,每种动物的噪声都是不同的,所以在基类中有任何实现是没有意义的。Cat子类可能看起来像public String makeNoise() { return "meow"; }Dog子类可能会返回“woof”,但在基类上没有健全的makeNoise实现。但是,如果基类上没有任何makeNoise,则不能要求任意动物makeNoise。因此,在基础上有一个public abstract String makeNoise()方法。这让你可以为任何动物调用makeNoise,即使你只有一个对Animal的引用

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

    所以,回答你的问题:当且仅当抽象的目的适用于这里时,你应该将其抽象化。根据您的示例代码,它不是