安卓我可以读取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 楼答案
不,它不是。正如你所看到的,你可以访问这些字段,即使它们是嵌套的,因为它们是静态的和最终的,你不能修改它们
抽象的目的是让你有一个基类,它有一个没有实现的方法。一个典型的例子是动物类。所有动物都会发出噪音(可能不会,但让我们假装一下),所以动物类应该有一个
makeNoise
方法。但是,每种动物的噪声都是不同的,所以在基类中有任何实现是没有意义的。Cat
子类可能看起来像public String makeNoise() { return "meow"; }
,Dog
子类可能会返回“woof”,但在基类上没有健全的makeNoise
实现。但是,如果基类上没有任何makeNoise
,则不能要求任意动物makeNoise
。因此,在基础上有一个public abstract String makeNoise()
方法。这让你可以为任何动物调用makeNoise
,即使你只有一个对Animal
的引用请注意,抽象与类是否嵌套无关。其他类,无论是否嵌套,都可以从嵌套的静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关
所以,回答你的问题:当且仅当抽象的目的适用于这里时,你应该将其抽象化。根据您的示例代码,它不是