2016-09-06 1 views
1

Ich möchte Daten auf einer Feder @Service speichern, um jedes Mal verwendet werden, wenn der Service aufgerufen wird.Speichern von privaten Variablen auf einer Feder @Service

Ist es eine gute Idee, es als private Klasse wie im folgenden Beispiel zu speichern?

+1

Es kann problematisch sein, da Spring Beans standardmäßig Singleton sind. Es hängt von der Verwendung davon ab – Jens

+1

Wenn Sie das tun möchten, verwenden Sie mindestens einen der atomaren Datentypen (wie AtomicInteger oder AtomicLong). – dunni

Antwort

0

Ich sehe kein Problem damit. Sie müssen sowieso mit Nebenläufigkeit umgehen, egal wie man zu abstrahieren es gehen:

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

    @Override 
    public int increment() { 
     return COUNTER.getAndIncrement(); 
    } 
} 
+0

Es ist besser, den AtomicInteger in Ihre Klasse zu integrieren. –

+0

@PetarPetrov Können Sie ein Beispiel geben? – Journeycorner

1

Meiner Meinung nach ist das eine schlechte Idee, weil es nicht threadsicher ist und vielleicht das Prinzip der einheitlichen Verantwortung bricht.

Wenn ich richtig verstehe, möchten Sie jedes Mal neue Nummer generieren, wenn Sie die Methode aufrufen. Ich schlage vor, dass Sie Klasse @ComponentNumberGenerator erstellen, die Zahlen generieren wird, und Sie können es Ihren Dienst injizieren. Dann können Sie es in Ihrem Service anrufen.

Wenn Sie eine Schnittstelle von NumberGenerator + DI erstellen, können Sie Implementierungen leicht ändern, anstatt Ihre Logik in Ihrem Service hart zu codieren.

Ich hoffe, dass dies Ihnen helfen wird zu entscheiden, welcher Weg besser ist.

0

Es hängt davon ab, was der Zähler für verwendet wird. Wenn es nur eine ungefähre Vorstellung davon ist, wie oft das Etwas aufgerufen wird, würde ich es private machen und es drinnen nennen. Wenn es sich 934957453 mal nennt, interessiert es niemanden, ob es um 1%/2% out ist, also würde ich mich nicht darum kümmern, es zu synchronisieren.

@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(); 
     ... 
    } 
} 

Wenn jedoch der Zähler in irgendeiner Weise verwendet wird, Revision zu tun, Anfrage-Tracking, die Erstellung von einzigartigen IDs oder nicht nur einen Zähler dann würden Sie es synchronisieren müssen und stellen Sie sicher, dass Sie keine Duplikate erhalten.

+0

Wenn es nicht oft aufgerufen wird, ist die Synchronisierung keine Bedrohung für die Leistung. Wenn es oft aufgerufen wird, sind die Chancen gut, dass Sie Probleme mit Nebenläufigkeit haben. Also nicht synchronisieren ist sowieso minderwertig. – Journeycorner

+0

Ich stimme nicht zu, Synchronisierung _ist_ eine Bedrohung für die Leistung. In einem stark gleichzeitigen System blockieren Threads gegeneinander, wenn sie versuchen, den Zähler zu erhöhen. Sie denken vielleicht, dass es wichtig ist, die Zahl immer korrekt zu korrigieren, aber in vielen Fällen ist dies nicht der Fall und ein gewisser Spielraum für Fehler ist akzeptabel, um einen synchronisierten Block zu entfernen. Wie ich bereits sagte, gibt es in der Frage des OP nicht genügend Informationen, um eine angemessene Antwort zu geben, da wir nicht wissen, wie der Zähler benutzt wird und wie wichtig er ist. –

Verwandte Themen