2016-11-16 6 views
0

私は書いたアプリケーションをリエンジニアリングしています。そのため、現在、テーブル定義をテーブルごとに1つずつ別のインターフェイスに分割し、データベース全体のインターフェイス全体を分離しています。相互参照されたインターフェイスに問題がありますか?

そうすることで、私はテーブルインターフェイスで使用されるいくつかの一般的な定数を全体のインターフェイスに持っています。全体のインタフェースは、テーブルインタフェースの定数も利用します。

私はこれを使用してすべての問題がないように見えるアプリをコンパイルして正常に実行しました(基本的には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

インタフェースである: -

DBDatabaseは、例えば、データベース全体に対して定義されたクラスであります以下ではgenerateExportSchemaSQLメソッドを使用します。

これをテストするには、SQLを作成してすべてのテーブルを作成します(これを実行してSQLをSQLite Managerにドロップし、テーブルを作成しました)。 stophereはブレークポイントに使用されたので、SQLを調べてコピーすることができました。

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

いくつかの質問:あなたのインターフェイスは定数値だけを定義します、そうですか?そして、あなたはどんな問題を期待していますか? – nandsito

+0

はいのみ定数です。私の懸念は、お互いを参照することで問題が発生する可能性があるということです。例:DBAislesTableConstantsはDBConstantsの値を使用し、その逆もあります(DBConstantsの値を取得する7つのDB ??? TablesConstantsがあり、現在までに3つの値が使用されています)。 – MikeT

答えて

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?

+0

私はインターフェイスの代わりにクラスを使って遊んでいます。アドバイスの1つは、私がやっていることよりもかなり周期的です:)。私はここでQ&Aを見ているので、クラスを優先して提案しているので、インターフェイスを使用しました。 – MikeT

+0

@MikeTはい、私は* cyclicness *を制限に押し込み、Javaがそれにどう反応するかを見ようとしました – nandsito