java - 编写带有启动和关闭的类

标签 java

我有一个表示外部资源(可以是线程或文件等)的类。这个类有startshutdown方法(例如 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 所做的那样),而不是在运行时强制执行。

失败的解决方案尝试

  1. shutdown返回 NoOpResource它扩展了 Resource 中的所有功能至 throw new UnsupportedOperationException();这并不能解决样板问题,因为您仍然需要记住扩展所有 n methods .
  2. 忽略问题,让用户自己承担风险。如果用户调用 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/

相关文章:

java - 如何在谷歌应用程序引擎中从 twilio 帮助程序库创建调用

java - Android 上的 FreeRDP - 如何让此代码在 android 和 windows 中工作?

java - 如何将以-开头的字符串写入csv文件?

java - HttpClient ssl 和 login.facebook.com

java - 从命令行使用 InputMappedClassifier

java - 黑莓列表字段 : Maintaining row focus during an update

java - byteBuffer.get() 和 0xFF 的目的是什么?

java - 将输入的文本转换为小写

java - 使用 GWT JNSI 从 Javascript 调用 Java

java - Sonar 无法覆盖调用异常抛出函数的分支