不久前,我在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
}
}
答案 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与嵌套的类无关。嵌套或不嵌套的其他类可以从嵌套的静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关。
所以,回答你的问题:当且仅当抽象的目的适用于此时,你才应该将其抽象化。鉴于您的示例代码,它没有。