Domanda

Per mantenere le cose semplificate Diciamo che ho un'interfaccia RandomProvider un'interfaccia

public interface RandomProvider
{
    double nextRandom();
}

E dire che ho 3 diverse implementazioni di questa interfaccia, arandom, Brandom, CRandom. Voglio raccogliere alcune statistiche sulle implementazioni:

  • quante volte nextRandom() si chiama
  • somma dei numeri casuali generati (può sembrare sciocco, ma questo è solo un esempio).

Alla fine verrà registrato queste statistiche a DB. Queste sono le classi pesantemente usati da più thread in modo che non è possibile scrivere i valori ogni volta che arriva una richiesta.

La prima idea che mi viene in mente è, faccio un Singleton che contiene questi dati, implementazioni chiamano il Singleton e aumentano le statistiche necessarie. Un'altra classe legge dal Singleton e scrive i risultati in DB e decrementa le statistiche. Ma ho letto tanti articoli su come il male dei dati a livello globale mutevole e single sono così ho paura di andare in questo modo.

Tutte le altre idee?

È stato utile?

Soluzione

Si singleton può essere un'idea malvagia, tuttavia, dipende dal loro utilizzo. Se si utilizza un Singleton solo per rendere il vostro lavoro di codice (permettendogli di toccare altre classi come un oggetto centrale globale), allora è male.

Ma in ultima analisi, si sono semplicemente alla ricerca di un modo per registrare le informazioni (un logger) e in questo caso non è una cattiva decisione di utilizzare un Singleton per registrare questi dati o anche per accedere a un testo / file di log.

Altri suggerimenti

È possibile utilizzare AOP per registrare tutte le chiamate di quel particolare metodo. Controllare AspectJ . In sostanza si sta andando a intercettare tutte le chiamate utilizzando un consiglio in giro e raccogliere le statistiche e fare le vostre operazioni personalizzate (sommando il numero casuale in questo caso). Poi conservare questo in un db.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top