[英]can I read public static final field inside a nested public static abstract class in Java
不久前,我在Android应用程序中创建了一个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
}
}
由于字段是静态最终字段,因此嵌套字段是否确实提供了额外的保护
如果嵌套类是公共的,则不是:它只是提供了一种符号上的不便。
如果嵌套类是静态的,为什么还要使其抽象呢?
不知道,这是你的课。
是否需要静态和抽象直接调用它而无需实例化外部类和嵌套类?
不, static
就足够了。
我也没有在这里看到BaseColumns
接口的需要。 我会认真考虑在列名中使用Enum
。
由于字段是静态最终字段,因此嵌套字段是否确实提供了额外的保护
不,不是。 如您所见,即使它们是嵌套的,您也可以访问这些字段,并且由于它们是静态的和最终的,因此您无法对其进行修改。
如果嵌套类是静态的,为什么还要使其抽象呢? 是否需要静态和抽象直接调用它而无需实例化外部类和嵌套类?
abstract的目的是允许您拥有一个包含没有实现的方法的基类。 一个经典的例子是动物类。 所有动物都会发出声音(可能不是,但请假装),因此Animal类应具有makeNoise
方法。 但是,每只动物的噪音都是不同的,因此在基类中进行任何实现都是没有意义的。 Cat
子类可能看起来像public String makeNoise() { return "meow"; }
public String makeNoise() { return "meow"; }
和Dog
子类可能返回“ woof”,但是在基类上没有健全的makeNoise
实现。 但是,如果您在基类上没有任何makeNoise
,那么您将无法要求任意动物使makeNoise
。 因此,您将在基础上拥有一个public abstract String makeNoise()
方法。 这使您makeNoise
为任何动物调用makeNoise
,即使您仅拥有对Animal
的引用。
注意,抽象与是否嵌套该类无关。 其他类(无论是否嵌套)都可以从嵌套的静态类继承。 它也与隐藏数据或以其他方式保护数据或代码无关。
因此,要回答您的问题:仅当抽象的目的在此处适用时,才应使其抽象。 根据您的示例代码,事实并非如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.