繁体   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