-1

次のようなことができる多くのJavaクラス/オブジェクトに大量のデータを保存したいと思います。

public static void main(String[] args){
    System.out.println(String.valueOf(Data.Foo.bar));
    System.out.println(String.valueOf(Data.Foo.array[0].bar));
}

出力:

True
False

====すべてのデータを含むデータクラス:

public class Data {
    public class Base {
        public boolean bar = false;
        public Base[] array = {};
    }

    public class Foo extends Base {
        this.bar = true;
        this.array = {Abc};
    }
    public class Abc extends Base {}
}

これらのクラスのインスタンスを作成したくありませんが、クラス内のデータにアクセスしたいと思います。データはすべて最終的なものであり、変更されることはありませんが、これらのデータをオーバーライドする別のオブジェクトによって変更する必要があります。(例のクラスFooを参照してください)

これを機能させるにはどうすればよいですか?

編集: Dataクラスは、プログラム全体のすべてのポイントからアクセスできる必要があります。Dataクラスのインスタンスがあってはなりません

編集 まあ、私はこれが「通常の」方法でどのように機能するかを例に挙げます...

public class Data {
    public Foo foo = new Foo();
    public Abc abc = new Abc();

    public class Base {
        public boolean bar = false;
        public Base[] array = {};
    }

    public class Foo extends Base {
        this.bar = true;
        this.array = {abc}; //changed to abc from Abc
    }
    public class Abc extends Base {}
}

これらの2行なしでFooクラスとAbcクラスを参照したいと思います。

    public Foo foo = new Foo();
    public Abc abc = new Abc();
4

2 に答える 2

2

クラス内のデータへのアクセスは、一般に、カプセル化の違反またはカプセル化の欠如です。オブジェクト指向プログラミング言語を使用している場合は、どちらも優れたアイデアではありません。

あなたがある程度の進歩を遂げたと仮定すると、タイプチェックは物事を難しくします。

あなたが別のプログラミング言語に精通していて、Javaのそのプログラミング言語で一般的なタスクをどのように行うかを尋ねているように見えます。答えは、あなたはしません。

クエリを次のように書き直します

public static void main(String[] args) {
    System.out.println(String.valueOf(Datas.getFoo().getBar()));
    System.out.println(String.valueOf(Datas.getFoo().getArray()[0].getBar()));
}

または、ロジックを修正して、物事のやり方については少し少なく、自分がしていることについてはもう少し見えるようにすることを検討してください。そのようです

public static void main(String[] args) {
    System.out.println(String.valueOf(Door.isOpen()));
    System.out.println(String.valueOf(Building.getDoors().atIndex(0).isOpen()));
}

最後に、クラスは概念的にのみ存在します。JVMが実行されているときは、すべてがクラスのインスタンスです。実行中のJVMはインスタンスのみを処理します。インスタンスの重複を避けたい場合は、それで問題ありません。ただし、インスタンスの処理を避けたい場合、それは不可能です。そうしようとすると、その言語を別の言語のように動作させようとするだけで、どのように見ても悪い結果が得られます。

于 2012-09-10T16:48:23.573 に答える
0

えーと、あなたの質問をよく理解しているかどうかはわかりませんが..

インスタンスを作成したくない..プログラム全体で1つのインスタンスを作成したいですか?スレッドを使用していますか?

クラスを静的にすることをお勧めします..静的参照はプログラム全体の1つにすぎず、他のインスタンスを作成する必要はありません。

静的フィールドとクラスを使用しない別の方法は、参照を介してクラスを呼び出すことです(参照はc / c ++のポインターと「等しい」)。したがって、たとえば、mainメソッドで1つのインスタンスのみを作成し、次にいくつかのメソッドなどを参照して呼び出します。このインスタンス..

良い方法は、シングルトンオブジェクトを使用することです。シングルトンは、オブジェクトプログラミングのデザインパターンの1つです。ここでは、オブジェクトがプログラム全体で1つだけになることが100%保証されています。シングルトンは静的フィールドに基づいています。したがって、シングルトンのような「ハード」なものは必要ないと思います(ただし、それはあなたにとって良いことです)。シングルトンについて何かを知るために)、そしてより良いのは静的フィールドと静的クラスを使用することです

于 2012-09-10T16:44:18.473 に答える