强制客户调用特定方法

时间:2017-03-28 04:45:55

标签: java

Java 7的库中,我有一个为其他类提供服务的类。这意味着,在创建服务类的实例之后,可以多次调用其中一个方法(例如doWork()方法)。所以我不知道它的任务何时完成。但是服务类使用重物,它应该释放它们。我在一个方法中设置了这个部分,例如release()但是不能保证其他开发人员使用这个方法。有没有办法强制其他开发人员在完成服务类任务后调用此方法?当然我可以记录下来,但我想强制它们。

注意:

我无法在release()方法中调用doWork()方法,因为doWrok()在下次调用时需要这些对象。

4 个答案:

答案 0 :(得分:3)

您可以使用许多JDK类使用的相同机制。有一个close()方法可以释放资源,清楚地记录下来,在完成对象后必须调用close()并让类实现AutoCloseable(它也声明{ {1}})。

当类实现close()时,您可以在AutoCloseable子句中使用它,因此您可以将代码编写为

try-with-resources

对于那些不是Java新手的人来说,这是一个熟悉的习惯用法,如果try(MyClass mc = new MyClass()) { mc.doWork(); mc.doMoreWork(); mc.someMoreWork(); } catch(SomeExceptionThatMayBeThrown e) { logger.log("Ooops", e); } 没有关闭,某些IDE也会显示警告。

对于其他要点,您可以实施将清理资源的AutoCloseable方法。然而,这是一种安全机制,不应该用作明确关闭的替代方法。整个事情就是如何实现finalize()和类似的JDK类。

答案 1 :(得分:1)

如果你不提前知道会有多少电话,那么就没有真正强迫别人的方法(你怎么知道最后一个电话是什么?)

您可以考虑运行某种静态守护程序线程来注册新创建的对象,并密切关注它们的空闲时间,但您必须设置时间限制。

答案 2 :(得分:1)

我认为Kayaman的答案通常是最正确的答案。

我只是想提出一个替代方案,而不是适用于每个方案的解决方案

您可以为开发人员提供一些工作,而不是强制调用者调用您的版本。

例如:

FooService fooService = new FooService();
fooService.doWork();
System.out.println("hello");
fooService.doWork();
System.out.println("world");
fooService.release();   // oops, developer may forget to call this

您可以提供类似以下内容的模板方法:

class FooWorkTemplate {
    void doSafely(Consumer<FooService> work) {
        FooService fooService = new FooService();
        work.accept(fooService);
        fooService.release();
     }
}

所以,来电者可以做类似

的事情
new FooWorkTemplate().doSafely( s -> {
        s.doWork();
        System.out.println("hello");
        s.doWork();
        System.out.println("world");
    });

让开发人员遵守惯例。

答案 3 :(得分:0)

如果您希望每次使用方法时都调用release(),只需在方法结束时调用release()。