Я хочу сохранить данные о пружине @Service, которые будут использоваться каждый раз при вызове службы.

Хорошо ли сохранить его как частный член класса, как в примере ниже?

@Service
public class MyServiceImpl implements MyService {
    private int counter;

    @Override
    public int increment() {
        return counter++;
    }
}
1
Tomer Amir 6 Сен 2016 в 10:07

3 ответа

Лучший ответ

Я не вижу в этом проблем. В любом случае вам нужно иметь дело с параллелизмом, независимо от того, как вы собираетесь его абстрагировать:

@Service
public class MyServiceImpl implements MyService {
    private static AtomicInteger COUNTER = new AtomicInteger(0);

    @Override
    public int increment() {
        return COUNTER.getAndIncrement();
    }
}
1
Journeycorner 6 Сен 2016 в 08:19

На мой взгляд, это плохая идея, потому что она небезопасна для потоков и, возможно, вы нарушаете принцип единой ответственности.

Если я правильно понимаю, вы хотите генерировать новый номер каждый раз, когда вызываете метод. Я предлагаю вам создать класс @Component NumberGenerator, который будет генерировать числа, и вы можете внедрить его в свою службу. Тогда вы сможете позвонить в свой сервис.

Если вы создаете интерфейс NumberGenerator + DI, вы можете легко изменить реализации вместо жесткого кодирования логики в своем сервисе.

Надеюсь, это поможет вам определиться, какой путь лучше.

1
Petar Petrov 6 Сен 2016 в 08:04

Это зависит от того, для чего используется счетчик. Если это всего лишь приблизительное представление о том, сколько раз что-то вызывается, я бы сделал это 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();
        ...
    }
}

Однако, если счетчик каким-либо образом используется для аудита, отслеживания запросов, создания уникальных идентификаторов или не просто счетчика, вам придется синхронизировать его и убедиться, что вы не можете получить дубликаты.

0
David Newcomb 6 Сен 2016 в 08:28