gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:23 25 4
gpt4 key购买 nike

我有一个表示外部资源(可以是线程或文件等)的类。这个类有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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com