11

私が本当に必要としているのは、インターフェイスで通常の変数を宣言し、そのインターフェイスを2つのクラスに実装できることです。これにより、各クラスでこれらを再宣言する必要がなくなります(つまり、class.variablesではなくclass.data.variables)。 。同じ目標を別の方法で達成できる方法はありますか?

詳細を説明します。基本的に、私はJScrollPane上にあるJPanelにJLabelsをドロップする小さな描画プログラムを作成しました。これらのJLabelには特定の設計があるため(つまり、これらはこのアプリケーションの航空会社のオブジェクトを表す描画用ではありません)、JLabelを拡張し、アプリケーション固有の変数を追加するクラスがあります。最終的に、これらの変数を使用してXMLファイルを読み書きし、デザインをロードおよび保存できるようにします。この拡張クラスは、アクセサーとしてNONEを指定したにもかかわらず(バグがあると読みました)、親クラスについて叫んでいるため、XML定義に使用できないため、同じクラスを作成して値をコピーして戻す必要があります。保存と読み込みを行ったり来たりします。

したがって、追加のデータ宣言を保持する1つのクラス(たとえばCellDataRecord.java)を作成し、そのクラスをXMLのようなものがなくても両方の場所(JLabel拡張機能とXMLデータ)で使用できると便利です。 data.CellDataRecordXXX。

4

2 に答える 2

7

これは、継承またはインターフェイスを使用して行うことができます。この場合、変数は親クラスの定数として設定されます。JLabelを拡張しているので、両方のクラスにインターフェースを実装する必要があります。

public interface MyInterface {
    int someint = 9;
}

public class MyClass1 extends JLabel implements MyInterface {
    //this class has access to `someint`
}

public class MyClass2 extends JLabel implements MyInterface {
    // also has access to `someint`
}

編集

異なるクラスから同じ変数を変更できるようにしたいので、コピーを変更せず、同じ変数を変更していることを確認する必要があります。したがってvolatile、変数にキーワードを使用して、すべてのスレッドがチェックする必要があることをJavaに示す必要があります。更新する前の値。

次に、他のクラスからインスタンスを作成して値を取得できるように、別のクラスを用意する必要があります。キーワードを使用しstaticて、すべてのクラスインスタンスに対して1つのコピーが保持されるようにする必要があります。

public class MyVariableWrapper {
    public static volatile int some_var = 9;
    public void updateSomeVar(int newvar) {
         some_var = newvar;
    }
    public int getSomeVar() { return some_var; }
}

これで、他の2つのクラスはこれを実行します。

public class MyClass1 extends JLabel {
    MyVariableWrapper myVariableWrapper;
    MyClass1() {
        super();
        myVariableWrapper = new MyVariableWrapper();
        // now I have access to `some_var`
    }
}

public class MyClass2 extends JLabel {
    MyVariableWrapper myVariableWrapper;
    MyClass2() {
        super();
        myVariableWrapper = new MyVariableWrapper();
        // now I have access to the same `some_var` as MyClass1
    }

    // this is a wrapper method for your convenience
    // since you don't like the excess code when accessing the variable
    public int getSomeVar() {
        return myVariableWrapper.some_var;
        // or myVariableWrapper.getSomeVar();
    }
    public void setSomeVar(int newvar) {
        myVariableWrapper.some_var = newvar;
        // or myVariableWrapper.setSomeVar(newvar);
    }
}

今、あなたはこれを行うことができます:

MyClass2 myClass2 = new MyClass2();
System.out.println(""+myClass2.getSomeVar());
于 2012-05-09T12:16:45.717 に答える
1

問題を100%把握できるかどうかはわかりませんが、説明の最初の数行から、インターフェイスを実装する代わりに、抽象クラスを定義してクラスに拡張させることができます。そうすれば、抽象クラスで属性を定義できるようになり、これらはすべてのサブクラスに共通になります。

于 2012-05-09T12:14:12.707 に答える