我正在重新设计我正在编写的应用程序,并且这样做我目前将表定义分成不同的接口,每个表一个,然后是整个数据库的整体接口。
在这样做时,我在整个接口中有一些常用的常量,用于表接口。整体界面也使用表接口中的常量。
我已经使用此编译并成功运行了一个应用程序(基本上是无处不在的 Hello World 应用程序,只有两行代码),所有这些似乎没问题。我真的很惊讶这个编译。
基本上,我走的路是注定要引起问题的。
以下是一些示例代码: -
界面 DBAislesTableConstants 注意!减少到只有一行
import static mjt.shopwise.DBConstants.DEFAULTORDER;
import static mjt.shopwise.DBConstants.IDTYPE;
import static mjt.shopwise.DBConstants.INT;
import static mjt.shopwise.DBConstants.PERIOD;
import static mjt.shopwise.DBConstants.STD_ID;
import static mjt.shopwise.DBConstants.TXT;
public interface DBAislesTableConstants {
String AISLES_ID_COL = STD_ID;
String AISLES_ID_COL_FULL = AISLES_TABLE +
PERIOD +
AISLES_ID_COL;
String AISLES_ALTID_COL = AISLES_TABLE + STD_ID;
String AISLES_ALTID_COL_FULL = AISLES_TABLE +
PERIOD +
AISLES_ALTID_COL;
String AISLES_ID_TYPE = IDTYPE;
Boolean AISLES_ID_PRIMARY_INDEX = true;
DBColumn AISLESIDCOL = new DBColumn(AISLES_ID_COL,
AISLES_ID_TYPE,
AISLES_ID_PRIMARY_INDEX,
""
);
ArrayList<DBColumn> AISLESCOLS = new ArrayList<>(Arrays.asList(AISLESIDCOL));
DBTable AISLESTABLE = new DBTable(AISLES_TABLE,AISLESCOLS);
}
DBColum和DBTable是定义的类,其中的方法用于构建我可以用于创建和更新实际数据库的内部模式。
接口 DBConstants 是: -
import java.util.ArrayList;
import java.util.Arrays;
import static mjt.shopwise.DBAislesTableConstants.AISLESTABLE;
import static mjt.shopwise.DBProductsTableConstants.PRODUCTSTABLE;
import static mjt.shopwise.DBShopsTableConstants.SHOPSTABLE;
interface DBConstants {
String DATABASE_NAME = "ShopWise";
String STD_ID = "_id";
String PERIOD = ".";
String INT = "INTEGER";
String TXT = "TEXT";
String IDTYPE = INT;
String DEFAULTORDER = "1000";
ArrayList<DBTable> SHOPWISETABLES = new ArrayList<>(Arrays.asList(
AISLESTABLE));
DBDatabase SHOPWISE = new DBDatabase(DATABASE_NAME,SHOPWISETABLES);
}
DBDatabase是整个数据库的已定义类,例如下面我使用generateExportSchemaSQL方法。
为了测试这个,我使用了以下内容,它创建了SQL来创建所有表(运行它并将SQL放入SQLite Manager并创建表)。 stophere只是用于断点,所以我可以检查并复制SQL。
String sql = DBConstants.SHOPWISE.generateExportSchemaSQL();
int stophere = 0;
答案 0 :(得分:1)
从语法上讲,交叉引用类(或接口,就此而言)不是问题。
我做了一个测试程序。所有类都在同一个包中。使用IntelliJ IDEA 2016.2.5和Oracle JDK 1.8.0_112,它编译时没有任何警告和运行,没有例外:
class ClassOne {
static final String CONSTANT_ONE = ClassTwo.CONSTANT_TWO;
}
class ClassTwo {
static final String CONSTANT_TWO = ClassOne.CONSTANT_ONE;
}
interface InterfaceOne {
String VALUE_ONE = InterfaceTwo.VALUE_TWO;
}
interface InterfaceTwo {
String VALUE_TWO = InterfaceOne.VALUE_ONE;
}
public class Main {
public static void main(String[] args) {
System.out.println(InterfaceOne.VALUE_ONE == null);
System.out.println(InterfaceTwo.VALUE_TWO == null);
System.out.println(ClassOne.CONSTANT_ONE == null);
System.out.println(ClassTwo.CONSTANT_TWO == null);
}
}
输出结果为:
true
true
true
true
因此导致语义问题。虽然Java允许循环引用类甚至它的字段,但在运行时它们将是null
,这很可能不是开发人员想要分配给字段的预期值。
总之,你应该注意字段中的循环引用。
顺便说一下,你应该在类而不是接口中定义常量。请参阅此问题:What is the use of interface constants?