0

だから私はこのコンストラクターを持っています:

 public MyClass(boolean done, int lvl , String s, int x, int y, Skill parent, Item item, int cost) {
    this.done = done;
    this.lvl = lvl;
    this.name = s;
    this.Xpos = x;
    this.Ypos = y;
    this.parent = parent;
    this.item = item;
    addSkill(this, s);
}

これを別のクラスで使用/初期化する必要なく使用する方法はありますか

MyClass myclass = new MyClass(false, 0, "", 0, 0, null, this.item, 1)

私がするだけなら

MyClass myclass;

次に、「恐ろしい」ヌルポインター例外が発生します。

4

5 に答える 5

3

パラメータを取らない 2 番目のコンストラクタを作成したいようです。

その後、書くことができます

MyClass myclass = new MyClass();
于 2013-08-20T17:16:39.517 に答える
0

いくつかの「デフォルト引数」が必要なようです。Python では、次のようなことができます。

class MyClass:
    def __init__(done=false, load=1, ...):
        self.done = done
        self.load = load
        # ...

a_new_instance = MyClass(done=true)

基本的に、すべての変数はデフォルト値から始まりますが、必要に応じて変更できます。

Java では、少し異なります。

class MyClass {
    private boolean done = false; // Notice the default value for done will be false
    // ... you would list (and instantiate!) the rest of your variables

    public MyClass() {}

    public MyClass(boolean done, int lvl, ...) {
         this.done = done;
         // ...
    }
}

このように、デフォルト値を変更したい場合にのみコンストラクターを呼び出す必要があります。しかし、1 つまたは 2 つの値だけを変更したい場合はどうなるでしょうか。さて、新しいコンストラクタを作成できます。

public MyClass(boolean done) { this.done = done; }
public MyClass(boolean done, int lvl) { this.done = done; this.lvl = lvl; }

しかし、これはすぐに手に負えなくなります!

したがって、これを回避するには、「ビルダー」パターンを使用できます。それは次のようになります。

public class MyClass {
    private boolean done;
    private int lvl;

    // Now the constructor is private and takes a builder.
    private MyClass(MyClassBuilder builder) {
        // ... and your variables come from the ones you will build.
        this.done = builder.done;
        this.lvl = builder.lvl;
        // ...
    }

    public static class MyClassBuilder {
        // The builder also has the same members.
        private boolean done;
        private int lvl;

        // Notice that we return the builder, this allows us to chain calls.
        public MyClassBuilder done(boolean isDone) {
            this.done = isDone;
            return this;
        }   

        public MyClassBuilder level(int level) {
            this.lvl = level;
        }

        // And a method to build the object.
        public MyClass build() {
            MyClass mc = new MyClass();
            mc.done = this.done;
            mc.lvl = this.lvl;
            // ... copy over all your variables from the builder to the new class
            return mc;
        }
    }
}

したがって、MyClassオブジェクトをインスタンス化したい場合は、次のようにできます。

MyClass mc = MyClassBuilder.done(false);

または、呼び出しをチェーンできます。

MyClass mc2 = MyClassBuilder.done(true).level(4). // ... you can go on for a while

余談ですが、クラスに 3 つまたは 4 つを超える変数がある場合は、そのクラスがやりすぎていることを示しています。クラスに複数の「責任」がある場合は、それをいくつかの小さなクラスに分割する必要があります。そうすれば、ビルダー クラスは必要ありません。

于 2013-08-20T17:37:43.390 に答える
0

MyClass myclass;は単なる参考です。それを何らかのオブジェクトにバインドする必要があります。テレビがなければリモコンは使えません。コンストラクターを短縮するために他にできることは、パラメーター 0 のコンストラクターを提供することだけです。

 public MyClass() {
    this.done = "default";
    this.lvl = "default value";
    this.name = "default value";
    this.Xpos = "default value";
    this.Ypos = "default value";
    this.parent = "default value";
    this.item = "default value";
}

今、あなたはこのようにすることができますMyClass mcRef=new MyClass();

于 2013-08-20T17:20:55.083 に答える