我正在重新设计一个我一直在写的应用程序,为此,我目前正在将表定义分为不同的接口,每个表一个,然后是整个数据库的整体接口。
这样做时,我在整个接口中有一些公用常量,这些常量在表接口中使用。整体接口还利用表接口中的常量。
我已经使用它编译并成功运行了一个应用程序(基本上是无处不在的Hello World应用程序,仅带有两行代码),一切似乎都很好。实际上,我对此感到很惊讶。
基本上,我是否注定要引起问题。
这是一些示例代码:
接口DBAislesTableConstants注意!减少到只有1行
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;
最佳答案
从句法上讲,交叉引用类(或接口)不是问题。
我做了一个测试程序。所有类都在同一包中。使用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?
关于java - 交叉引用的接口(interface)会有问题吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40624970/