是否存在交叉引用接口的问题?

时间:2016-11-16 05:53:15

标签: java android sqlite interface

我正在重新设计我正在编写的应用程序,并且这样做我目前将表定义分成不同的接口,每个表一个,然后是整个数据库的整体接口。

在这样做时,我在整个接口中有一些常用的常量,用于表接口。整体界面也使用表接口中的常量。

我已经使用此编译并成功运行了一个应用程序(基本上是无处不在的 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;

1 个答案:

答案 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?