簡體   English   中英

我可以在Java中嵌套的公共靜態抽象類中讀取公共靜態最終字段嗎

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM