我想在每次调用服务时使用的弹簧@Service
上保存数据。
将它保存为私有类成员是否是个好主意,如下例所示?
@Service
public class MyServiceImpl implements MyService {
private int counter;
@Override
public int increment() {
return counter++;
}
}
答案 0 :(得分:1)
在我看来,这是个坏主意,因为它不是线程安全的,也许你违反了单一责任原则。
如果我理解正确,您每次调用该方法时都要生成新的数字。我建议您创建课程@Component
NumberGenerator
,这将生成数字,您可以将其注入您的服务。然后你可以在你的服务中调用它。
如果您创建NumberGenerator
+ DI的界面,您可以轻松更改实施,而不是在服务中对您的逻辑进行硬编码。
我希望这可以帮助您决定哪种方式更好。
答案 1 :(得分:0)
我认为没问题。无论如何,无论如何抽象它,你都需要处理并发:
@Service
public class MyServiceImpl implements MyService {
private static AtomicInteger COUNTER = new AtomicInteger(0);
@Override
public int increment() {
return COUNTER.getAndIncrement();
}
}
答案 2 :(得分:0)
这取决于计数器的用途。如果只是粗略地知道这个东西被调用多少次,我会把它private
并在里面调用它。如果它被称为934957453次,没有人真正关心它是否超出1%/ 2%所以我不打扰同步它。
@Service
public class MyServiceImpl implements MyService {
private int counter=0;
private int increment() {
return counter++;
}
@Override
public getNumberOfCalls() {
return counter;
}
@Override
public int someMethod() {
increment();
...
}
}
但是,如果以某种方式使用计数器进行审核,请求跟踪,创建唯一ID或者不仅仅是计数器,那么您必须同步它并确保无法获得重复。