Я пытаюсь реализовать цепочку фильтров, которая буквально одинакова для каждого входящего сообщения. Есть ли идея, как этот код можно улучшить, чтобы избежать создания FilterChain
объекта для каждого сообщения. Делает ли цепочка фильтров как ThreadLocal
(и затем просит каждый поток возвращать ее копию) что-то мне в этой ситуации?
// a common interface for all filters that might be added to a filter chain
public interface Filter {
void doFilter(Message message, FilterChain chain);
}
// a filter chain implementation
class FilterChain {
private final Iterator<Filter> filtersIterator;
FilterChain(List<Filter> filters) {
filtersIterator = filters.iterator();
}
void doFilter(Message message) {
if (filtersIterator.hasNext())
filtersIterator.next().doFilter(message, this);
}
}
// an abstract bot class
public abstract class AbstractBot {
private final Executor executor = Executors.newFixedThreadPool(4);
private final List<Filter> filters = addFilters();
// handles message objects
protected abstract void process(Message message);
// an overridable hook for subclasses to add their own list of filters
protected List<Filter> addFilters() {
return new ArrayList<>();
}
public void start() {
// just before we start, add the last-in-chain filter implemented by lambda,
// whose only purpose is to hand over a message object to the process-method
filters.add((message, chain) -> process(message));
while (true) {
// make long-polling requests to the server for incoming messages
List<Message> messages = requestMessages();
for (Message message : messages) {
executor.execute(() -> {
FilterChain chain = new FilterChain(filters);
chain.doFilter(message);
});
}
}
}
}