我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗
所以不久前,我在Android应用程序中创建了一个SQLiteHelper类。我不能100%确定原因,但表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但我的应用程序开始变得复杂,我想用公共静态最终表和列名字段填充其他类中的字段。经过一些尝试和错误,阅读了有关抽象类、静态类和嵌套类的内容后,我突然想到可以直接调用字段,如中所示我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗,java,android,oop,android-sqlite,abstract-class,Java,Android,Oop,Android Sqlite,Abstract Class,所以不久前,我在Android应用程序中创建了一个SQLiteHelper类。我不能100%确定原因,但表名和列名是嵌套的公共静态抽象类中的公共静态最终字段。我记得,目标是保护字段不被修改。这一切都很好,但我的应用程序开始变得复杂,我想用公共静态最终表和列名字段填充其他类中的字段。经过一些尝试和错误,阅读了有关抽象类、静态类和嵌套类的内容后,我突然想到可以直接调用字段,如中所示 String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDE
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
}
}
由于字段是静态的final,嵌套字段实际上提供了额外的保护吗
如果嵌套类是公共的,则不会这样做:它只是提供了一个符号不便
如果嵌套类是静态的,为什么还要将其抽象
不知道,这是你的课
是否需要静态和抽象来直接调用它,而不需要实例化外部类和嵌套类
否,静态
就足够了
我认为这里也不需要BaseColumns
接口。我会认真考虑使用Enum
作为列名
由于字段是静态的final,嵌套字段实际上提供了额外的保护吗
不,没有。正如您所看到的,即使字段是嵌套的,您也可以访问这些字段,因为它们是静态的和最终的,所以您不能修改它们
如果嵌套类是静态的,为什么还要将其抽象?是否需要静态和抽象来直接调用它,而不需要实例化外部类和嵌套类
抽象的目的是允许您拥有一个基类,该基类具有一个没有实现的方法。一个典型的例子是动物类。所有动物都会发出噪音(可能不会,但让我们假设一下),因此动物类应该有一个makeNoise
方法。但是,每个类都是不同的,所以在基类中有任何实现都是没有意义的。Cat
子类可能看起来像public String makeNoise(){return“meow”;}
和Dog
子类可能返回“woof”,但在基类上没有合理的makeNoise
实现。但是,如果基类上没有任何makeNoise
,则不能要求任意动物makeNoise
。因此,在基础上有一个公共抽象字符串makeNoise()
方法。这允许您为任何动物调用makeNoise
,即使您所拥有的只是对动物的引用
注意,抽象与类是否嵌套无关。其他类,无论是否嵌套,都可以从嵌套的静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关
所以,回答你的问题:当且仅当抽象的目的在这里适用时,你应该将其抽象化。鉴于您的示例代码,它并不完全是我的代码。。它是从一个关于Android数据库的网站的示例中派生出来的。我所有的问题都与样本是如何组织的有关,我对样本的困惑是问题的原因。当然,这不是我的代码,我当然无法回答关于作者为什么使用摘要,
他是谁的问题。其他人也一样。是的,我现在明白了,这似乎没有道理。从这个意义上说,你回答了这个问题。