0

私は Java に比較的慣れていないので、オンライン ゲーム Minecraft の拡張機能/プラグインをコーディングしています。

私は最近、より多くのクラスを必要とする「より大きな」プロジェクトを開始しました。私はまだコンストラクターがどのように機能するかを完全に理解しようとしていますが、最近の試みではスタック オーバーフロー (あるコンストラクターがループ内で別のコンストラクターを呼び出す) が発生しました。

たとえば、私の場合、2 つのクラスが MainありMySQLます。

メイン クラスはプラグインを初期化し、MySQL クラスはデータベースに接続し、それを呼び出した任意のクラスにデータを返します。

問題のあるコードの例:

Main.java

class Main extends JavaPlugin {

    private final MySQL mysql = new MySQL();

    //Method which is called first 
    void onEnable(){

        //Just an example of initializing
        mysql.init();
        mysql.open();
    }
}

MySQL.java

class MySQL {

    private final Main main = new Main();

    void init(){}
    void open(){}
}

問題が何であるかはわかっていますが、適切な解決策がわかりません。これは、さらに多くのクラスで機能します。

また、別のクラスがあり、メインがMySQLに接続し、別のクラスがそれと通信する場合、 main.mysql.methodのようなことをする必要がありますか?

コンストラクターとインスタンス (「新しい」キーワード) がどのように機能するかについての単純でわかりやすい説明をいただければ幸いです。前もって感謝します !

4

2 に答える 2

1

まず第一に、将来のアプリケーションへの指針として、デザイン パターンを見てみることをお勧めします。これらは、デザインをよりクリーンで維持しやすくする傾向があります。

あなたの場合、Circular Referenceを作成しました。それを回避する最も簡単な方法は、次のようにすることです。

class Main extends JavaPlugin {

    private final MySQL mysql;

    public Main(MySQL mysql)
    {
        this.mysql = mysql
    }

    //Class which is called first 
    void onEnable() {

        //Just an example of initializing
        mysql.init();
        mysql.open();
    }
}

class MySQL {

    private final Main main = new Main(this);

    void init(){}
    void open(){}
}

これで問題は解決するはずです。

そうは言っても、MySQLクラスにはデータベース関連のメカニズムがあると想定しています。このようなメカニズムは通常、Singleton設計パターンを通じて公開されます。この設計パターンでは、必要な場合にのみクラス内のメソッドにアクセスできるMySQLため、循環参照の問題も回避できます。

于 2012-08-09T09:53:26.027 に答える
0

mysqlタイプのオブジェクトが作成されるたびに、フィールドをインスタンス化する必要がありますMain。新しいMySQLインスタンスが作成されると、フィールドMain mainがあるため、新しいMainインスタンスが作成されます。20 goto 10:-)

MySQLクラスでは、次の 2 つの方法で別のインスタンスの作成を回避できます。 の静的メンバーMainを参照するか、内にネストされたクラスを作成します。この場合、余分なフィールドは必要ありません。MainMySQLMain

于 2012-08-09T09:54:37.113 に答える