这似乎是AutoCloseable
接口的用例和Java 7中引入的try-with-resources
语句。
public class MyService implements AutoCloseable {
public void doWork() {
// ...
}
@Override
public void close() {
// release resources
}
}
然后您的消费者可以将其用作
public class MyConsumer {
public void foo() {
try (MyService myService = new MyService()) {
//...
myService.doWork()
//...
myService.doWork()
//...
}
}
}
不必担心调用显式方法release
,无论其代码是否引发异常。
附加答案
如果您真正要寻找的是确保没有人会忘记使用您的功能,那么您必须做几件事
- 确保的所有构造函数
MyService
都是私有的。
- 定义要使用的单个入口点,以
MyService
确保在此之后对其进行清理。
你会做类似的事情
public interface MyServiceConsumer {
void accept(MyService value);
}
public class MyService implements AutoCloseable {
private MyService() {
}
public static void useMyService(MyServiceConsumer consumer) {
try (MyService myService = new MyService()) {
consumer.accept(myService)
}
}
}
然后,您将其用作
public class MyConsumer {
public void foo() {
MyService.useMyService(new MyServiceConsumer() {
public void accept(MyService myService) {
myService.doWork()
}
});
}
}
我最初不建议使用此路径,因为它没有Java-8 lambda和功能性接口(MyServiceConsumer
变为Consumer<MyService>
),因此很丑陋,并且确实强加于您的使用者。但是,如果您只想要被release()
调用,它将起作用。