2015-07-29 13 views
5

Il mio obiettivo è controllare il tipo di messages e quindi convertirli in stringhe e aggiungerli. Come posso raggiungere questo obiettivo?Come rendere accettabile il metodo Elenco che contiene oggetti di qualsiasi tipo di dati

public void addMessages(List<?> messages) { 
    if (messages != null) { 
     if (messages instanceof String) { 
      for (String message : messages) { 
       this.messages.add(message); 
      } 
     } 
    } 

    else { 
     for (Object message:messages) { 
      this.messages.add(String.valueOf(message)); 
     } 
    } 
} 
+1

'public addoid addMessages (Elenco messaggi) {'? – MadProgrammer

risposta

2

Si può solo passare un elenco di oggetti - non è nemmeno necessario il if/else perché si può sempre chiamare semplicemente "toString()" o "String.valueOf" sull'oggetto messaggio:

public void addMessages(List<Object> messages) { 
    if (!CollectionUtils.isEmpty(messages)) { 
     for (Object message : messages) { 
      this.messages.add(String.valueOf(message)); 
     } 
    } 
} 

Nota a margine: Potrebbero sorgere problemi con l'inserimento di elementi nulli nell'elenco dei messaggi, quindi è consigliabile verificarne la presenza nel ciclo. Altre insidie ​​potenziali sono:

  • this.messages non è inizializzata e l'aggiunta di messaggi getta un NullPointerException
  • se questo è un metodo di un Singleton (ad esempio, un servizio di primavera) che lavorano con le variabili di istanza dovrebbe essere evitato
2
public void addMessages(List<Object> messages) { 

che è appena sufficiente dove messages tenere tutti i tipi di oggetti.

+0

Quindi non è possibile passare l'oggetto Elenco a questo metodo –

+0

Cosa intendete dire che non è possibile passare, ora ne ho passato uno. – Babel

+0

@Babel, Java non consente di passare la raccolta Elenco a un metodo che utilizza l'elenco . La ragione per cui tutti gli interi sono oggetti. Ma tutti gli oggetti non sono interi. Se è consentito, è possibile aggiungere una stringa a questa raccolta passata che viola il vincolo che l'elenco deve contenere solo numeri interi. –

1

È possibile ottenere ciò con "Java Generics".

L'oggetto Messages inizializzato nel seguente metodo principale accetterà l'elenco di oggetti di qualsiasi tipo. È possibile inizializzare l'oggetto Messages anche con un tipo specifico.

public class Messages<T> { 

    private List<T> messages = new ArrayList<T>(); 

    public void addMessages(List<T> messages) { 
     for (T message : messages) { 
      // Use String.valueOf or message.toString() 
      // if you would like to convert the objects to String. 
     } 
    } 

    public static void main(String[] args) { 
     Messages<Object> msg = new Messages<Object>(); 
     msg.addMessages(/** Your List of objects of any type **/); 
    } 

} 
+0

cosa succede se il messaggio non è un'istanza di String. sarà qualcosa di simile a questo lavoro: altro per (Oggetto messaggio: messaggi) { this.messages.add (String.valueOf (message)); } – Roxy

+0

@Tajinder - Questo è solo un codice di esempio per passare l'elenco di oggetti di qualsiasi tipo a un metodo che utilizza Java Generics. Ho rimosso l'istanza di controllo nella mia risposta sopra. È possibile scrivere la propria logica aziendale per gestire i messaggi. Se vuoi convertirlo in stringa, puoi usare String.valueOf() o .toString(). –

+0

quando sto cercando di recuperare i dati dal tipo di messaggio di ritorno. \t messaggio predefinito receive() { \t \t Messaggio message = (Message) rabbitTemplate.receiveAndConvert(); \t \t ritorno (messaggio); \t}. mi sta avvisando: Il messaggio è di tipo grezzo – Roxy

0

Questo è solo un miglioramento rispetto alle risposte di nutfox.

public void addMessages(List<?> messages) { 
     List<String> collect = messages.stream().map(i -> String.valueOf(i)).collect(Collectors.toList()); 
     this.messages.addAll(collect); 
} 
Problemi correlati