gpt4 book ai didi

java - 我可以在Java中的嵌套公共(public)静态抽象类中读取公共(public)静态最终字段吗

转载 作者:行者123 更新时间:2023-12-02 04:52:28 26 4
gpt4 key购买 nike

不久前,我在 Android 应用程序中创建了一个 SQLiteHelper 类。我不是 100% 确定原因,但表名和列名是嵌套公共(public)静态抽象类中的公共(public)静态最终字段。我记得,目标是保护字段不被修改。一切都很好,但我的应用程序开始变得复杂,我想用公共(public)静态最终表和列名称字段填充其他类中的字段。经过一番尝试和错误,并阅读了有关抽象类、静态类和嵌套类的内容,我想到可以直接调用该字段,如下所示。

String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;

尽管我已经阅读了这些主题,但在我的具体案例中如何将它们结合在一起仍然让我摸不着头脑。所以我的问题是,由于字段是静态最终的,嵌套字段实际上是否提供了额外的保护,如果嵌套类是静态的,为什么还要将其抽象化?是否需要静态和抽象才能直接调用它而不需要实例化外部类和嵌套类?

感谢您的帮助。我真的很想了解各种类的实现。

以下是该类的关键元素:

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
}

}

最佳答案

since the fields are static final, does nesting the fields actually provide additional protection

不,事实并非如此。正如您所看到的,即使这些字段是嵌套的,您也可以访问它们,并且由于它们是静态的和最终的,因此您无法修改它们。

and if the nested class is static, why also make it abstract? Is static AND abstract required to call it directly without needing to instantiate the outer and nested classes?

抽象的目的是让您拥有一个具有没有实现的方法的基类。一个典型的例子是 Animal 类。所有动物都会发出噪音(可能不会,但我们假设一下),因此 Animal 类应该有一个 makeNoise 方法。但是,每种动物的噪音都是不同的,因此在基类中进行任何实现是没有意义的。 Cat 子类可能看起来像 public String makeNoise() { return "meow"; }Dog 子类可能会返回“woof”,但基类上没有 makeNoise 的合理实现。但是,如果基类上没有任何 makeNoise,则无法要求任意动物 makeNoise。因此,您将在基础上有一个 public abstract String makeNoise() 方法。这样您就可以为任何动物调用 makeNoise,即使您拥有的只是对 Animal 的引用。

请注意,abstract 与类是否嵌套无关。其他类,无论是否嵌套,都可以从嵌套静态类继承。它也与隐藏数据或以其他方式保护数据或代码无关。

所以,回答你的问题:当且仅当抽象的目的适用于此时,你才应该将其抽象化。根据您的示例代码,事实并非如此。

关于java - 我可以在Java中的嵌套公共(public)静态抽象类中读取公共(public)静态最终字段吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com