Metodo Arrays.asList e invocazione del costruttore

di il
6 risposte

Metodo Arrays.asList e invocazione del costruttore

Ciao a tutti, ho un problema con un pezzettino di codice che non riesco a capire, ve lo posto:

public static Collection<Integer[]> test()
{
	return Arrays.asList(new Integer[][] {{1,2,3},{4,5,6}});
}


Cosa fa questo metodo? Da quanto ho capito restituisce una lista di interi in questo formato

[[1,2],[4,5]]
E' corretto? Ho provato a stamparla ma mi restituisce un oggetto (credo)
 [[Ljava.lang.Integer;@67df02c9, [Ljava.lang.Integer;@62300f65 ] 
In seguito a questo "return" viene chiamato il costruttore della classe 2 volte: una volta con argomento (1,2) e la seconda volta con argomento (4,5). Ma non ho capisco come fa:

Questo è il costruttore:

public MioTest(double n1, double n2)
{
       ....
}
Grazie della disponibilità.

6 Risposte

  • Re: Metodo Arrays.asList e invocazione del costruttore

    Escher ha scritto:


    
    public static Collection<integer[]> test()
    {
    	return Arrays.asList(new Integer[][] {1,2,3},{4,5,6}});
    }
    
    Manca solo una { iniziale dell'array e poi è Integer non integer nella parametrizzazione. Ma per il resto è corretto/sensato.

    Escher ha scritto:


    Cosa fa questo metodo? Da quanto ho capito restituisce una lista di interi in questo formato
    
    [[1,2],[4,5]]
    
    Più precisamente restituisce una lista in cui ciascun elemento è un array di oggetti Integer

    Escher ha scritto:


    Ho provato a stamparla ma mi restituisce un oggetto (credo)
     [[Ljava.lang.Integer;@67df02c9, [Ljava.lang.Integer;@62300f65 ] 
    Perché gli array non ridefiniscono il toString() (resta quello di Object che fornisce solo quella forma). Devi iterare sulla collezione e stampare ciascun array sfruttando il Arrays.toString() (a meno che vuoi iterare manualmente sull'array).

    Escher ha scritto:


    In seguito a questo "return" viene chiamato il costruttore della classe 2 volte: una volta con argomento (1,2) e la seconda volta con argomento (4,5). Ma non ho capisco come fa:

    Questo è il costruttore:
    
    public MioTest(double n1, double n2)
    {
           ....
    }
    
    Mi spiace ... non è chiaro chi/come invoca MioTest.
  • Re: Metodo Arrays.asList e invocazione del costruttore

    Ok, mi è venuto in mente. Probabilmente per quel tuo MioTest stiamo parlando dei "Parameterized tests" fattibili con JUnit.
    Vedi
  • Re: Metodo Arrays.asList e invocazione del costruttore

    Manca solo una { iniziale dell'array e poi è Integer non integer nella parametrizzazione. Ma per il resto è corretto/sensato.
    Scusa per gli errori e grazie delle correzioni.

    Grazie della risposta esaustiva per quanto riguarda il metodo "test".
    Ok, mi è venuto in mente. Probabilmente per quel tuo MioTest stiamo parlando dei "Parameterized tests" fattibili con JUnit.
    Esatto, sto studiando quello. Non mi è chiaro come fa a chiamare "MioTest" cmq adesso mi guardo il link che hai postato.

    Grazie ancora!
  • Re: Metodo Arrays.asList e invocazione del costruttore

    Forse ho capito.

    - JUnit processa la classe "Parameterized.class" (nel mio caso "test") ed identifica i test da eseguire.
    - Per ogni test, JUnit invoca il costruttore con quei parametri e crea una nuova istanza. Il numero di parametri della classe "Parameterized" (la mia "test") deve essere uguale ai parametri accettati dal costruttore.
    - Infine JUnit valida il caso di test attraverso la classe Assert.

    Può andare come spiegazione?

    Grazie ancora dell'aiuto.
  • Re: Metodo Arrays.asList e invocazione del costruttore

    Escher ha scritto:


    - JUnit processa la classe "Parameterized.class" (nel mio caso "test") ed identifica i test da eseguire.
    - Per ogni test, JUnit invoca il costruttore con quei parametri e crea una nuova istanza. Il numero di parametri della classe "Parameterized" (la mia "test") deve essere uguale ai parametri accettati dal costruttore.
    - Infine JUnit valida il caso di test attraverso la classe Assert.

    Può andare come spiegazione?
    Sì, è corretto, è proprio una feature di JUnit. La classe di test è sempre JUnit che la istanzia. Generalmenre/normalmente JUnit si aspetta un costruttore no-arg (senza argomenti), perché chiaramente non saprebbe certo cosa passare.

    Se però la classe è annotata con @RunWith(Parameterized.class), allora per JUnit è una classe di test "parametrizzata". JUnit quindi si aspetta che ci sia un metodo static annotato con @Parameters da cui prendere i parametri.
    JUnit crea sempre una nuova istanza per ciascun metodo di test da eseguire. Con la parametrizzazione vuol dire che ciascun metodo di test verrà eseguito più volte, ogni volta con una tupla diversa di parametri.

    Guarda il primo esempio alla pagina linkata. Il metodo da testare è quel Fibonacci.compute(), che riceve un int e restituisce un int.
    Il senso di quel:
    new Object[][] {     
        { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
    }
    è relativo al costruttore

    public FibonacciTest(int input, int expected)

    JUnit prende ciascuna tupla {0,0} ... poi {1,1} e di volta in volta istanzia la classe con questi parametri.

    quindi vorrà dire che:
    - test() verrà invocato per avere input 0 ed aspettarsi 0
    - test() verrà invocato per avere input 1 ed aspettarsi 1
    - test() verrà invocato per avere input 2 ed aspettarsi 1
    ecc... secondo l'array.
  • Re: Metodo Arrays.asList e invocazione del costruttore

    Grazie mille della spiegazione , ho capito tutto (anche dal link che mi hai dato), sei stato molto disponibile nell'aiutarmi.

    Grazie ancora !
Devi accedere o registrarti per scrivere nel forum
6 risposte