[英]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.