所以我有这个Contructor:
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;
然后我得到了“可怕的”空指针异常。
答案 0 :(得分:2)
听起来你想要创建一个不带参数的第二个构造函数。
然后你可以写
MyClass myclass = new MyClass();
答案 1 :(得分:2)
我建议您实施类似于Builder Pattern的内容。它非常通用。您可以在Wikipedia上阅读有关Builder Pattern的更多信息。
答案 2 :(得分: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();
答案 3 :(得分: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
顺便说一句,有时在一个班级中有超过三个或四个变量,这表明班级做得太多了。如果班级有多个“责任”,你应该把它分成几个小班。那么你将不需要一个构建器类。
答案 4 :(得分:0)
这不是C ++。所有引用的默认值均为null
。如果您不使用new
,则对象仍为null
。
如果你不喜欢多参数构造函数,有几种初始化方法。您可以让setter返回this
和链初始化,如:
Person p = new Person().setAge(18).setName("Tom").setHeight(175);
甚至只是
Person p = new Person().age(18).name("Tom").height(175);
这种方法并不常见,但绝对容易阅读并且很难弄错。
您也可以使用静态工厂方法,例如
class Person {
private Person() {} // mark as private to force creation with static method
public static Person create() {
Person p = new Person();
//fill default values?
return p;
}
}