我可以在 Java 中的嵌套 public 静态摘要 class 中读取 public static final 字段吗
can I read public static final field inside a nested public static abstract class in Java
不久前,我在我的 Android 应用程序中创建了一个 SQLiteHelper Class。我不是 100% 确定为什么,但是 table 和列名是嵌套 public 静态摘要 class 中的 public 静态最终字段。我记得,目标是保护字段不被修改。一切都很好,但我的应用程序开始变得复杂,我想用 public static final table 和列名字段填充其他 classes 中的字段。经过一些尝试和错误,并阅读了有关抽象 classes、静态 classes 和嵌套 classes 的内容后,我想到可以直接调用该字段,如下所示。
String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;
尽管我已经阅读了这些主题,但在我的具体情况下如何将它们结合在一起仍然让我摸不着头脑。所以我的问题是,由于字段是静态最终的,嵌套字段实际上是否提供了额外的保护,如果嵌套的 class 是静态的,为什么还要将其抽象化?是否需要静态和抽象才能直接调用它而不需要实例化外部和嵌套classes?
感谢您的帮助。我真的很想了解各种 class 实现。
这是 class 的关键要素:
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
如果嵌套的 class 是 public 则不是:它只是提供了符号上的不便。
and if the nested class is static, why also make it abstract?
不知道,这是你的 class。
Is static AND abstract required to call it directly without needing to instantiate the outer and nested classes?
不,static
就够了。
我也没有看到这里需要 BaseColumns
接口。我会认真考虑使用 Enum
作为列名。
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?
abstract 的目的是让您拥有一个基础 class,其中包含一个没有实现的方法。一个 classic 示例是动物 class。所有动物都会发出声音(可能不会,但让我们假装)所以 Animal class 应该有一个 makeNoise
方法。但是,每种动物的声音都不同,因此在基础 class 中进行任何实现是没有意义的。 Cat
subclass 可能看起来像 public String makeNoise() { return "meow"; }
而 Dog
subclass 可能看起来像 return "woof",但是没有合理的实现makeNoise
基础 class。但是,如果你在基地 class 上没有任何 makeNoise
,你就不能要求任意动物 makeNoise
。所以你会在基础上有一个 public abstract String makeNoise()
方法。这使您可以为任何动物调用 makeNoise
,即使您所拥有的只是对 Animal
.
的引用
请注意,抽象与 class 是否嵌套无关。其他 classes,无论是否嵌套,都可以从嵌套静态 class 继承。它也与隐藏数据或以其他方式保护数据或代码无关。
因此,回答您的问题:当且仅当抽象的目的适用于此时,您才应该将其抽象化。鉴于您的示例代码,它没有。
不久前,我在我的 Android 应用程序中创建了一个 SQLiteHelper Class。我不是 100% 确定为什么,但是 table 和列名是嵌套 public 静态摘要 class 中的 public 静态最终字段。我记得,目标是保护字段不被修改。一切都很好,但我的应用程序开始变得复杂,我想用 public static final table 和列名字段填充其他 classes 中的字段。经过一些尝试和错误,并阅读了有关抽象 classes、静态 classes 和嵌套 classes 的内容后,我想到可以直接调用该字段,如下所示。
String myTable = MySQLiteHelper.dbFields.TABLE_NAME_REMINDER;
尽管我已经阅读了这些主题,但在我的具体情况下如何将它们结合在一起仍然让我摸不着头脑。所以我的问题是,由于字段是静态最终的,嵌套字段实际上是否提供了额外的保护,如果嵌套的 class 是静态的,为什么还要将其抽象化?是否需要静态和抽象才能直接调用它而不需要实例化外部和嵌套classes?
感谢您的帮助。我真的很想了解各种 class 实现。
这是 class 的关键要素:
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
如果嵌套的 class 是 public 则不是:它只是提供了符号上的不便。
and if the nested class is static, why also make it abstract?
不知道,这是你的 class。
Is static AND abstract required to call it directly without needing to instantiate the outer and nested classes?
不,static
就够了。
我也没有看到这里需要 BaseColumns
接口。我会认真考虑使用 Enum
作为列名。
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?
abstract 的目的是让您拥有一个基础 class,其中包含一个没有实现的方法。一个 classic 示例是动物 class。所有动物都会发出声音(可能不会,但让我们假装)所以 Animal class 应该有一个 makeNoise
方法。但是,每种动物的声音都不同,因此在基础 class 中进行任何实现是没有意义的。 Cat
subclass 可能看起来像 public String makeNoise() { return "meow"; }
而 Dog
subclass 可能看起来像 return "woof",但是没有合理的实现makeNoise
基础 class。但是,如果你在基地 class 上没有任何 makeNoise
,你就不能要求任意动物 makeNoise
。所以你会在基础上有一个 public abstract String makeNoise()
方法。这使您可以为任何动物调用 makeNoise
,即使您所拥有的只是对 Animal
.
请注意,抽象与 class 是否嵌套无关。其他 classes,无论是否嵌套,都可以从嵌套静态 class 继承。它也与隐藏数据或以其他方式保护数据或代码无关。
因此,回答您的问题:当且仅当抽象的目的适用于此时,您才应该将其抽象化。鉴于您的示例代码,它没有。