【问题标题】:Are there going to be issues with cross referenced interfaces?交叉引用的接口会有问题吗?
【发布时间】:2016-11-16 05:53:15
【问题描述】:

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

这样做时,我在整个界面中有一些常用常量,它们在表格界面中使用。总体而言,接口还利用了表接口中的常量。

我已经使用它编译并成功运行了一个应用程序(基本上是无处不在的 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 管理器并创建表)。 stophere 只是用作断点,因此我可以检查和复制 SQL。

String sql = DBConstants.SHOPWISE.generateExportSchemaSQL();
int stophere = 0;

【问题讨论】:

  • 一些问题:您的接口只定义常量值,对吗?以及,您期待什么问题?
  • 是的,只有常量。我担心的是相互引用可能会导致问题,尽管从一个小测试来看,这样做似乎是可以的。例如,DBAislesTableConstants 使用来自 DBConstants 的值,反之亦然(将有 7 个 DB???TablesConstants,每个都从 DBConstants 获取值,迄今为止已完成 3 个)。

标签: java android sqlite interface


【解决方案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?

【讨论】:

  • 我正在使用类而不是接口。有一件事,建议比我正在做的更具循环性:)。我使用接口是因为看到这里的问答建议它们优先于类。
  • @MikeT 是的,我打算将 循环 推到极限,看看 Java 是如何响应的
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2013-05-24
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多