如何强制java对象按特定顺序实例化其实例变量?
有一门课:如何强制java对象按特定顺序实例化其实例变量?,java,oop,instance-variables,Java,Oop,Instance Variables,有一门课: class Test { Object1 object1; Object2 object2; void setObject2 (Object2 newObject) { if (object1.someMethod()) { this.object2 = newObject; } else { someOtherMethod(); } } } 如何强制对象实例化object1必须在object2之前实例化 现在我可
class Test {
Object1 object1;
Object2 object2;
void setObject2 (Object2 newObject) {
if (object1.someMethod()) {
this.object2 = newObject;
} else {
someOtherMethod();
}
}
}
如何强制对象实例化object1必须在object2之前实例化
现在我可以想办法解决它
1.使用Object2作为参数创建构造函数并在其中实例化
Test(Object1 object1) {
this.object1 = object1;
}
2.通过从尝试设置object2的方法引发异常
有没有其他更合适的方法来实现这一目标
我之所以需要它,是因为我必须为一个地区object1创建新的广告活动测试,以宣传该地区的一些网站object2。在将站点添加到活动之前,我想检查站点是否属于该区域。您可以限制object2的初始化,以便仅在对象已被初始化时才能实例化它
public void setObject2 (Object2 newObject) {
if(object1 == null){
throw new IllegalStateException();
}else{
this.object2 = newObject;
}
}
您可以限制object2的初始化,使其仅在对象已初始化时才能实例化
public void setObject2 (Object2 newObject) {
if(object1 == null){
throw new IllegalStateException();
}else{
this.object2 = newObject;
}
}
是的,应该使用构造函数将变量初始化到适当的状态,您实际上可以创建一个测试类构造函数,以实现如下所示的相同功能:
public Test(Object1 obj1, Object2 obj2) {
//if objects are null throw an error
if(obj1 == null) {
throw IllegalStateException("Invalid Object1 passed");
} else {
this.obj1 = obj1;
//check someMethod() returns true and then set object2
if (obj1.someMethod()) {
this.obj2 = obj2;
} else {
//obj1.someMethod() is false, call someOtherMethod()
someOtherMethod();
}
}
如果强制变量的状态未正确初始化,则最好从构造函数中抛出上述异常,以便对象在创建后不会处于不一致的状态。是的,应使用构造函数将变量初始化为适当的状态,实际上,您可以创建一个测试类构造函数来实现如下所示:
public Test(Object1 obj1, Object2 obj2) {
//if objects are null throw an error
if(obj1 == null) {
throw IllegalStateException("Invalid Object1 passed");
} else {
this.obj1 = obj1;
//check someMethod() returns true and then set object2
if (obj1.someMethod()) {
this.obj2 = obj2;
} else {
//obj1.someMethod() is false, call someOtherMethod()
someOtherMethod();
}
}
如果强制变量的状态未正确初始化,则最好从构造函数中抛出如上所述的异常,以便对象在创建后不会处于不一致的状态。一种更简洁的设计方式是使用生成器模式。通过这种方式,您可以仅以正确的方式设置和创建对象,而不必在运行时获取异常
程序员不需要阅读文档或错误消息来找出他需要做什么,因为API本身起指导作用。更简洁的设计方法是使用Builder模式。通过这种方式,您可以仅以正确的方式设置和创建对象,而不必在运行时获取异常
程序员不需要阅读文档或错误消息来了解他需要做什么,因为API本身就起指导作用。我可以问一下你的目的吗?@acornagl你在问我吗?@Itamagreen不,很抱歉,我要求Marcin,但@@acornagl出了问题。我必须为一个地区创建新的广告活动,为该地区的一些网站做广告。在我将网站添加到活动之前,我想检查该网站是否属于该地区。@MarcinKruglik我明白了。我可以问一下你的目的吗?@acornagl你在问我吗?@Itamagreen不,很抱歉,我要求Marcin,但@@acornagl出了问题。我必须为一个地区创建新的广告活动,为该地区的一些网站做广告。在将站点添加到活动之前,我想检查该站点是否属于该区域。@MarcinKruglik,我明白了。上面的内容是正确的,此外,该方法还可以抛出java.lang.IllegalStateException,因此处理该类的人员知道有些事情出了问题。IllegalStateException:表示方法在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。这是一个坏主意,因为调用方无法知道对setter的调用没有任何效果。@Bohemian修复它。实施srinath的idea@ItamarGreen或者您可以让它返回一个布尔值,以指示操作是否成功结束。@aleb2000无需,如果用户收到异常,他们知道上面的错误是正确的,另外该方法可以抛出java.lang.IllegalStateException,所以在班上工作的人知道有些事情搞砸了。IllegalStateException:表示方法在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。这是一个坏主意,因为调用方无法知道对setter的调用没有任何效果。@Bohemian修复它。实施srinath的idea@ItamarGreen或者您可以让它返回一个布尔值,以指示操作是否成功结束。@aleb2000无需,如果用户收到异常,他们知道出错的原因。实际上,我在实际代码中使用了生成器模式。我试图使我的问题一般化,而不是拘泥于具体情况。即使我使用生成器,我也需要使用一些算法来检查实例变量的实例化顺序是否正确。我试图使我的问题一般化,而不是拘泥于具体情况。即使我使用生成器,我也需要使用一些算法来检查实例变量的实例化顺序是否正确。如果使用构造函数,则会引发异常
始终obj1始终为空为什么obj1始终为空?抱歉,我以为您指的是此。obj1。如果使用构造函数,则将始终引发异常obj1始终为空为什么obj1始终为空?抱歉,我以为您指的是此。obj1。