2016-11-16 5 views
0

Ich re-Engineering eine App, die ich geschrieben habe und dabei bin ich derzeit Tabellen-Definitionen in verschiedene Schnittstellen, eine pro Tabelle und dann eine Gesamtschnittstelle für die gesamte Datenbank zu trennen.Gibt es Probleme mit referenzierten Schnittstellen?

Dabei habe ich einige allgemeine Konstanten in der Gesamtschnittstelle, die in den Tabellenschnittstellen verwendet werden. Die gesamte Schnittstelle verwendet auch Konstanten von den Tabellenschnittstellen.

Ich habe kompiliert und erfolgreich eine App (im Grunde die allgegenwärtige Hallo Welt App mit nur zwei zusätzlichen Zeilen Code) mit dieser und alles scheint in Ordnung zu sein. Ich bin eigentlich ziemlich überrascht, dass das kompiliert.

Grundsätzlich nehme ich einen Pfad, der dazu verurteilt ist, Probleme zu verursachen.

Hier einige Beispiel-Code: -

Schnittstelle DBAislesTableConstants Hinweis! reduziert auf nur 1 Zeile

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 und DBTable werden mit Methoden definiert Klassen zu bauen, was ich werde ein internes Schema für die Erstellung und Aktualisierung der aktuellen Datenbank verwendet werden.

Schnittstelle DBConstants ist: -

DBDatabase eine definierte Klasse für die gesamte Datenbank ist z.B. Im Folgenden verwende ich die generateExportSchemaSQL-Methode.

Um dies zu testen, habe ich Folgendes verwendet, die erstellt die SQL, um alle Tabellen zu erstellen (führte dies und legte die SQL in SQLite Manager und erstellte die Tabellen). stophere wurde nur für einen Haltepunkt verwendet, damit ich das SQL untersuchen und kopieren konnte.

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

einige Fragen: Ihre Schnittstellen definieren nur konstante Werte, ist das richtig? und welche Probleme erwarten Sie? – nandsito

+0

Ja nur Konstanten. Meine Sorge ist, dass die gegenseitige Bezugnahme Probleme verursachen kann, obwohl es aus einem kleinen Test als ok erscheint, dies zu tun. ZB verwendet DBAislesTableConstants Werte von DBConstants und umgekehrt (es wird 7 DB geben ??? TablesConstants jeder erhält Werte von DBConstants, arbeitet mit 3 bis dato getan). – MikeT

Antwort

1

Syntaktisch sind Querverweis Klassen (oder Schnittstellen, für die Angelegenheit) kein Problem.

Ich habe ein Testprogramm gemacht. Alle Klassen sind im selben Paket. IntelliJ IDEA Mit 2016.02.05 und Oracle JDK 1.8.0_112, kompiliert ohne Warnungen und läuft ohne Ausnahmen:

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); 
    } 
} 

Die Ausgabe lautet:

true 
true 
true 
true 

Dies führt zu einem semantischen Problem. Während Java zyklische Verweise auf Klassen und sogar deren Felder erlaubt, werden sie in der Laufzeit null sein, was höchstwahrscheinlich nicht der erwartete Wert ist, den der Entwickler den Feldern zuweisen wollte.

In der Summe sollten Sie auf zyklische Referenzen in Feldern achten.

Übrigens sollten Sie Konstanten in Klassen anstelle von Schnittstellen definieren. Siehe diese Frage: What is the use of interface constants?

+0

Ich spiele mit Klassen anstelle von Schnittstellen. Eine Sache, der Ratschlag ist ziemlich zyklisch als das, was ich tue :). Ich habe Schnittstellen verwendet, weil hier Q & A's zu sehen sind, was sie eher als Klassen vorschlägt. – MikeT

+0

@MikeT Ja, ich wollte die * Zyklizität * an die Grenzen bringen und sehen, wie Java darauf reagiert – nandsito

Verwandte Themen