Newsgroup: it.comp.java
Titolo: classe STATIC FINAL

Salve
una classe dichiarata in questo modo:
public static final class MiaClasse
{
}
in cosa si differenzia da una classe semplicemente public?
static final si utilizza di solito per definire costanti, o metodo non 
ridefinibili tramite ereditarietà...ma per le classi?
grazie

 in cosa si differenzia da una classe semplicemente public?
sicuramente si tratta di una inner class, cioè una classe innestata 
dentro un'altra classe.
per quanto riguarda il modificatore static:
http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html
per quanto riguarda il final:
http://java.sun.com/docs/books/jls/second_edition/html/
classes.doc.html#54727

il 13.03.2010 16.29, Scrive magicNumber 38553368:

final significa che non puo' essere estesa, non l'ho mai usato, ma direi 
ch una classe static possa contenere solo membri statici, e non e' una 
classe inner. Un interface, anche se non dichiarato esplicitamente, e' 
sempre static.

 sempre static.
Ti sbagli su static. Per una spiegazione approfondita provate questo 
(non l'ho letto ma dubito contenga errori ;) )
http://www.mokabyte.it/1997/10/inner.htm

 sempre static.
una top level class non può essere static, ne può avere senso in base al 
significato che ha il modificatore static per le inner class.
 

  
Adesso magari mi becco un cazziatone, ma non si poteva usare il
modificatore static per definire classi non istanziabili?
Saluti

 modificatore static per definire classi non istanziabili? Saluti
no, non si poteva.
abstract è il modificatore che impedisce ad una classe di essere 
istanziata.

rootkit ha scritto:

Giusto,
in alternativa, nel caso in cui volessi creare una classe con dei metodi
"helper" e costanti e altri elementi static, basterebbe mettere il
costruttore private per renderla non istanziabile (anche senza creare un
singleton).
In quel caso avrebbe senso inserire solo il modificatore final alla
classe.(lascio perdere static..)
Cosa ne pensate?
(avevo usato in alcuni casi delle classi non istanziabili del genere
come "Manager" per famiglie di altre classi)

 come "Manager" per famiglie di altre classi)
Ad esempio la classe Math :
public final class Math
E' non istanziabile... non mi pare sia un Singleton

il 13.03.2010 19.39, Scrive cicap 38553368:

Io ho letto questo, e *sono sicuro* che non contenga errori, trattandosi 
del Java Language Specification della Sun: 
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#246026
 
  Magari interpreto male, non lo escudo a priori, pero' alla sezione 
8.5.2 dice:
The static keyword may modify the declaration of a member type C within 
the body of a non-inner class T. Its effect is to declare that C is not 
an inner class. Just as a static method of T has no current instance of 
T in its body, C also has no current instance of T, nor does it have any 
lexically enclosing instances.
It is a compile-time error if a static class contains a usage of a 
non-static member of an enclosing class.
Member interfaces are always implicitly static. It is permitted but not 
required for the declaration of a member interface to explicitly list 
the static modifier.

il 14.03.2010 18.46, Scrive Fabiano 38553368:

Non e' istanziabile solo perche' l'unico costruttore, quello di default, 
e' dichiarato private.
     /**
      * Don't let anyone instantiate this class.
      */
     private Math() {}

il 13.03.2010 19.39, Scrive cicap 38553368:

Hai ragione, ho letto male cio' che ho scritto io, cio' che ho omesso di 
scrivere, avrebbe dovuto leggersi:
*e non puo' essere specificato se non e' una classe inner"


L'errore più grosso è asserire che possa contenere solo metodi statici, 
che non è assolutamente vero.
Quello che dice la specifica è invece che i metodi di tipo membro 
statico non vedono l'istanza della classe contenitrice, come invece 
accadrebbe nel caso omettessi "static".

il 15.03.2010 19.03, Scrive cicap 38511680:

Quindi da un metodo, static o meno, di una classe inner static non posso 
richiamare i metodi della classe outer che non siano anch'essi definiti 
static, in quanto la classe inner non contiene l'istanza della classe 
outer come avviene normalmente.
Ora mi sembra piu' chiaro, mi resta solo di trovarci un'utilita'.

     private Math() {}
avevo capito che bastava il costruttore private a renderla non
istanziabile, avevo usato Math come sempio di una classe non istanziabile.
Mi era stato risposto qualche post prima che per avere una classe non
istanziabile bisogna usare il modificatore abstract, la risposta pur
essendo corretta mi pareva trascurasse  questa possibilità .


Di solito si usa per emulare un meccanismo di namespacing altrimenti 
assente in Java.
E' un modo per rimarcare che questa classe figlia va usata a stretto 
contatto con quella padre o che comunque è logicamente molto legata ad essa.
Inoltre mi pare che abbia dei privilegi di visibilità in quanto può 
accedere ai metodi private e protected della classe padre.

il 15.03.2010 19.46, Scrive cicap 38511680:

Una classe inner direi che non abbia mai restrizioni di accesso ai 
metodi della classe outer. Nel senso che:
public class Outer {
   private String stringaPrivata;
   public static void main(String[] args) {
     Outer o = new Outer();
     Inner i = o.new Inner();
     i.setPrivata("pippo");
     System.out.println(i.getPrivata());
   }
   private String getStringaPrivata() {
     return stringaPrivata;
   }
   public class Inner {
     public void setPrivata(String privata) {
	stringaPrivata = privata;
     }
     public String getPrivata() {
	return getStringaPrivata();
     }
   }
}
funziona.

il 15.03.2010 19.36, Scrive Fabiano 38511680:

Una classe non e' istanziabile in tutti e due i casi, sia che abbia il 
costruttore di defualt private o abstract, ovvero il costruttore senza 
argomenti, con la differenza che se la classe non e' final il 
costruttore abstract puo' essere richiamato da una classe che la 
estende, mentre se il costruttore è private non lo puo chiamare neanche 
la classe che estende.
Per cui una classe final che abbia il costruttore di default private non 
la si puo' istanziare in nessun modo, sempre che non abbia un membro 
statico che creino un'istanza, ad esempio:
public final class Pippo {
   private static Pippo pippoInstance;
   private Pippo() {
     super();
   }
   public static Pippo getPippoInstance() {
     if (pippoInstance == null) pippoInstance = new Pippo();
     return pippoInstance;
   }
}

 la classe che estende.
Quindi una classe che ha solo costruttori private non può essere estesa!
Lucio
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org

 }
Grazie,
adesso ho il quadro completo.
Saluti

 Quindi una classe che ha solo costruttori private non può essere estesa!
No, la puoi estendere ma non la puoi istanziare.
Puoi estendere qualsiasi classe che non sia final, cio' che non potra' 
fare la classe che estende, sara' la riscrittura del costruttore 
private. Se e' private anche il costruttore di default, ovvero quello 
senza argomenti ereditato da Object, la classe non potra' essere 
istanziata se non da un metodo della stessa classe.

Dr.Ugo Gagliardelli ha scritto:

Mi sono espresso male.
Intendevo che se una classe ha tutti costruttori privati, non può essere 
estesa in quanto in tal caso la classe figlia non ha nessun modo per 
essere istanziata. Infatti i costruttori della classe figlia (pubblici o 
privati che siano) non possono invocare i costruttori (tutti privati) 
della classe padre, necessari per la costruzione dell'oggetto.


 essere istanziata.
beh direi che non è corretto. il fatto che una classe figlia non possa 
essere istanziata non significa che non possa estendere la classe padre. 
per esempio con delle implementazioni di metodi statici. così su due 
piedi non mi viene in mente un pattern che lo faccia però è formalmente 
fattibile.
 

 della classe padre, necessari per la costruzione dell'oggetto.
Certo, in realta' mi sono espresso male io, se non puoi in qualche modo 
  ereditare il costruttore che discende da Object, ne' esplicitamente 
ne' implicitamente, non potrai rispettare il contratto che regola tutte 
le classi Java, ovvero la discendenza da Object.

  
Se la classe da estendere non ha costruttori visibili, ed esplicitamente 
ha il costruttore di default, quello ereditato da Object, privato, come 
fai a creare la classe? Anche se non dichiari esplicitamente un 
costruttore, il compilatore ti dira' qualcosa del tipo "il costruttore 
super() non e' visibile'. Prova ad estendere java.lang.Runtime
che non e' final ma il costruttore di default e' esplicitamente private 
e non ha altri costruttori.

 fai a creare la classe? 
scusate, il mio era un ragionamento generale sul concetto "non poter 
estendere" -> "non poter istanziare", non mi riferivo al caso specifico.