내 클래스에 자원을 확보하는 start() 메소드와 자원을 해제하는 stop() 메소드가 있다고 가정합니다. 클래스의 start 메소드는 멤버 객체의 start() 메소드를 호출 할 수 있습니다. 멤버 객체 중 하나의 start()가 예외를 throw하는 경우 start()가 성공한 모든 멤버 객체에 대해 stop()이 호출되는지 확인해야합니다.Java에서 unwind-like 정리 코드 작성
class X {
public X()
{
a = new A();
b = new B();
c = new C();
d = new D();
}
public void start() throws Exception
{
try {
a.start();
} catch (Exception e) {
throw e;
}
try {
b.start();
} catch (Exception e) {
a.stop();
throw e;
}
try {
c.start();
} catch (Exception e) {
b.stop();
a.stop();
throw e;
}
try {
d.start();
} catch (Exception e) {
c.stop();
b.stop();
a.stop();
throw e;
}
}
public void stop()
{
d.stop();
c.stop();
b.stop();
a.stop();
}
private A a;
private B b;
private C c;
private D d;
}
클린업 코드의 2 차 증가에주의하십시오. 정리를 수행하는 가장 좋은 방법은 무엇입니까 (최소 코드 금액)? C에서는 함수의 맨 아래에있는 정리 코드를 사용하여 쉽게이 작업을 수행 할 수 있으며 "goto"를 사용하여 적절한 위치로 이동할 수 있습니다.하지만 Java에는 goto가 없습니다. start()되지 않은 객체에서 stop()을 호출하는 것은 허용되지 않습니다. 위와 동일하지만 더 짧은 코드를 찾고 있습니다.
지금까지 내가 왔어요 유일한 해결책은 다음과 같이 시작 있었는지 기억하는 논리 값을 사용하는 것입니다, 나는 "마지막으로"에 대해 알고
public void start() throws Exception
{
boolean aStarted = false;
boolean bStarted = false;
boolean cStarted = false;
boolean dStarted = false;
try {
a.start();
aStarted = true;
b.start();
bStarted = true;
c.start();
cStarted = true;
d.start();
dStarted = true;
} catch (Exception e) {
if (dStarted) d.stop();
if (cStarted) c.stop();
if (bStarted) b.stop();
if (aStarted) a.stop();
throw e;
}
}
을하고 "시도 --자원"하지만, 예외가 없으면 리소스를 해제해서는 안되기 때문에 여기에 해당되지 않는 것으로 보입니다.
P. 이것은 예외 사용이나 프로그램 설계에 대한 질문이 아닙니다. 특히 초기화 코드가 실패 할 경우 정리하는 것입니다.
시작되지 않은 리소스에 'stop'을 호출하면 어떻게됩니까? – assylias
"시작되지 않은 객체에서 stop()을 호출 할 수 없다는 것을 언급했습니다." 이를 위해 start() 및 stop() 함수에 assert()가있을 수 있습니다. –
stop() 메소드를보다 강력하게 만들고 항상 호출하십시오. –