Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 2, 9 CFU => Topic started by: Nessuno on 24-03-2011, 21:57:14



Title: STATIC FACTORY (2) - classe Boolean (esempio)
Post by: Nessuno on 24-03-2011, 21:57:14
La classe Boolean fatta a lezione non è che compili tanto...a me dà l'errore seguente:
Code:
MetodiStaticFactory.java:60: variable v might not have been initialized
     Boolean v = v.NewIstanceOf(a);
                 ^
1 error

Code:
class Boolean{
  
  static  boolean T;
  static boolean F;  
  
  static final Boolean TRUE = new Boolean(T);
  static  final Boolean FALSE = new Boolean(F);
  

  //COSTRUTTORE STANDARD
  private Boolean(boolean value)
  {
 
    if (value) T=value;
    else F=value;

  }

  public static Boolean NewIstanceOf(boolean value)
  {

    return new Boolean(value);  
  }
  
  public static Boolean ValueOf(boolean value)
  {
    return (value ? TRUE : FALSE);
  }
  public static Boolean ValueOfString1(String value)
  {
    if(value.equals("TRUE")) return TRUE;
    if(value.equals("FALSE")) return FALSE;
    
    return null;
  }
  public static Boolean ValueOfString2(String value)
  {
    return value.equals("TRUE")?TRUE : value.equals("FALSE")?FALSE : null;
  }
}

public class MetodiStaticFactory
{
  public static void main (String[]args)
  {
    boolean a = true;
     Boolean v = v.NewIstanceOf(a);
  }
}
Perchè mi dà questo errore nel main?....
Avete provato a compilare la classe esempio fatta a lezione?
Grazie in anticipo


Title: Re:STATIC FACTORY (2) - classe Boolean (esempio)
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 24-03-2011, 22:52:30
In questo codice:
Code:
Boolean v = v.NewIstanceOf(a);
tu stai chiedendo di accedere al metodo NewInstanceOf dell'oggetto referenziato da v, solo che v, in questo punto di codice, non è ancora stato inizializzato (in particolare non gli è ancora stato assegnato alcun riferimento, nemmeno null!!!).

Ad ogni modo, la ragionevolezza induce a pensare che il compilatore potrebbe anche lasciar invocare metodi statici su variabili riferimento a oggetto di una certa classe, anche se l'oggetto in sé non è ancora stato inizializzato, giacché dell'oggetto in sé non viene né letto né scritto lo stato (e ogni oggetto in qualche modo rappresenta il suo stato, a meno che non li si voglia vedere come variabili della programmazione funzionale, come in Featherweight Java, ...).

Sarebbe auspicabile che questa cosa sia corretta nelle prossime funzioni di Java, non in quanto bug, ma come una feature aggiuntiva .smile .

In conclusione, il modo auspicabile (e corretto, nel tuo caso) per invocare metodi statici (anche per far risaltare subito agli occhi la loro staticità già leggendo il codice) sarebbe di invocarli sulla classe che li contiene. Nel tuo caso, così:
Code:
Boolean v = Boolean.NewInstanceOf

Leggo inoltre che il docente vi richiede di usare la nomenclatura CamelCase, tuttavia in Java la convenzione standard per la nomenclatura è un CamelCase modificato nel fatto che la primissima lettera va rigorosamente tenuta minuscola. Fateglielo presente, se ve la sentite .smile.

Buona sera .ciaociao.

(EDIT: avevo scritto "buona sera" due volte  :boh)


Title: Re:STATIC FACTORY (2) - classe Boolean (esempio)
Post by: Nessuno on 25-03-2011, 09:33:46
...In conclusione, il modo auspicabile (e corretto, nel tuo caso) per invocare metodi statici (anche per far risaltare subito agli occhi la loro staticità già leggendo il codice) sarebbe di invocarli sulla classe che li contiene. Nel tuo caso, così:
Code:
Boolean v = Boolean.NewInstanceOf
[/i]....


Cioè..io dovrei istanziare un oggetto passando attraverso un metodo statico della classe( ..NewIstanceOf() in questo caso..) , perchè il suo costruttore è privato e quindi inaccessibile dall'esterno..ma per accedere ad un suo metodo statico devo prima istanziare l'oggetto(e per far questo il costruttore deve esser pubblico)..sembra il cane che si morde la coda..non ho capito :( .. Boolean v = Boolean.NewInstanceOf dove dovrei piazzarlo???


Title: Re:STATIC FACTORY (2) - classe Boolean (esempio)
Post by: Nessuno on 25-03-2011, 10:01:50
OK OK ...risolto ogni dubbio :);

Grazie infinite Reverse...il tuo commento mi ha fatto riflettere un bel po'. :)