我有一个表示外部资源(可以是线程或文件等)的类。这个类有start
和 shutdown
方法(例如 start
启动线程,shutdown
关闭线程)。该类还公开了几个方法:method_1
, method_2
,..., method_n
作用于外部资源。
此设计的问题在于它仅对调用 methods
之一有效在调用 start
之间和 shutdown
.因此,我必须添加 if (!started()) throw new IllegalStateException()
的样板文件所有 n
methods
.这也迫使用户小心保护对 methods
的所有调用。与 if (resource.started()) resource.method();
我们可以保证start
通过将构造函数设为私有(private)并添加静态工厂方法来调用 createStarted()
这将返回 null
如果start
失败。但是问题仍然存在,因为用户仍然可以调用 shutdown()
然后调用method
.所以我们还是需要守护所有的methods
.
必须将此样板文件添加到所有 methods
感觉很浪费以防止类的不当使用。理想情况下,我希望编译器有一种方法来强制执行此限制(就像我们对 start
所做的那样),而不是在运行时强制执行。
失败的解决方案尝试
- 有
shutdown
返回NoOpResource
它扩展了Resource
中的所有功能至throw new UnsupportedOperationException();
这并不能解决样板问题,因为您仍然需要记住扩展所有n
methods
. - 忽略问题,让用户自己承担风险。如果用户调用
shutdown
然后是另一种方法,他们应该处于他们自己进入的未定义状态。这似乎有点危险,我想我更喜欢样板文件。
最佳答案
您是否尝试过使用 AspectJ 创建方面?它可能看起来像这样,它将在 MyResource
类中的任何方法之前被调用。
@Aspect
public class ResourceAspect {
@Before("execution(* com.example.MyResource.*) ")
public void beforeResourceMethod(JoinPoint jp) {
MyResource r = (MyResource) jp.getThis();
if(!r.isStarted()) throw new IllegalStateException();
}
}
可以将 AspectJ 与 Spring AOP 一起使用,或者单独使用 AspectJ。
关于java - 编写带有启动和关闭的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41553674/