Děkuji za objasnění, už jsem zase o něco zkušenější :-))

                Mirek
 

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Martin Kuba
Sent: Tuesday, May 22, 2007 11:00 AM
To: Java
Subject: Re: Naprosto začátečnický dotaz

Prohnal jsem ten zdrojak pres Intellij IDEA, aby pripadne odhalila dalsi 
problemy, a stezuje si, ze:

1) SingletonOne a SingletonTwo maji oba konstruktor,
   ktery se implicitne odkazuje na konstruktor v SingletonBase,
   ale ten ma private pristup, takze je nedostupny.
   Konstruktor v SingletonBase by mel byt protected.

2) Stejne tak maji metodu methodA() s "protected" pristupem,
   coz je restriktivnejsi nez "public" pristup
   prekryvane metody methodA() v SingletonBase

Tudiz by to neslo zkompilovat.

Co se tyka puvodni otazky, jak uz tu vazeni kolegove napsali, staticke promenne 
a metody patri tride a *nededi* se, tj. trida podedena ze tridy se statickou 
promennou nema vlastni kopii te promenne.

Kdyz si zkusite spustit nasledujici kod:

SingletonOne singletonOne = SingletonOne.getInstance(); SingletonTwo 
singletonTwo = SingletonTwo.getInstance(); SingletonOne singletonOne2 = 
SingletonOne.getInstance(); System.out.println("singletonOne = " + 
singletonOne); System.out.println("singletonTwo = " + singletonTwo);
System.out.println("singletonOne2 = " + singletonOne2);

tak dostanete:

Exception in thread "main" java.lang.ClassCastException: cz.stohr.SingletonTwo 
cannot be cast to cz.stohr.SingletonOne
        at cz.stohr.SingletonOne.getInstance(SingletonOne.java:22)
        at cz.stohr.SingletonBase.main(SingletonBase.java:29)

protoze duhy radek zpusobi, ze promenna v SingletonBase zacne obsahovat 
instanci SingletonTwo.

Makub

Stöhr Miroslav RNDr. Ph.D. wrote:
> Vážení kolegové,
> 
> nějak jsem se zamotal s naprosto začátečnickým problémem, za což se stydím, 
> ale mohli by jste mi pomoci?
> 
> Mám následující tři classy:
> 
> public abstract class SigletonBase {
> 
>       protected static SingletonBase instance;
> 
>       private SingletonBase(){
>               // nejaka nepodstatna konfigurace
>       }
> 
>       public abstract void methodA();
> 
>       public void methodP(){
>               // nejaka spolecna implementace
>       }
> }
> 
> public class SingletonOne extends SingletonBase {
> 
>       static {
>               SingletonOne.instance = new SingletonOne();
>       }
> 
>       private SingletonOne(){
>               //  dalsi inicializace
>       }
> 
>       public static SingletonOne getInstance(){
>               return (SingletonOne)instance;
>       }
> 
>       protected void methodA(){
>               // implementace A
>       }
> 
> }
> 
> public class SingletonTwo extends SingletonBase {
> 
>       static {
>               SingletonTwo.instance = new SingletonTwo();
>       }
> 
>       private SingletonTwo(){
>               //  dalsi inicializace, ale jina nez u SingletonOne
>       }
> 
>       public static SingletonTwo getInstance(){
>               return (SingletonTwo)instance;
>       }
> 
>       protected void methodA(){
>               // implementace A, ale jina nez u SingletonOne
>       }
> 
> }
> 
> 
> A otazka: Je tento konstrukt bezpečný ve smyslu že mám zajištěno, že vždy 
> instance SingletonOne bude jiná než SingletonTwo? Jedna se mi o to, když mám 
> zděděné pole, které je static, jestli opravdu patří pouze classu, který 
> inicializuji, nikoliv classu jeho předka (který je v mém případě společný). 
> Koukal jsem se do java spec. a moudrý z toho nejsem, zkušební projekt po 
> kompilaci a spuštění mi řekne, že jsou to dvě oddělené instance (JDK 1.4.2), 
> ale pořád si nejsem jistý jestli nedělám naprosto školáckou chybu. Stačí 
> nasměrovat na patřičnou sekci v java spec. 
> 
> Děkuji za objasnění.
> 
>                     Mirek
> 


--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno             Martin Kuba
Institute of Computer Science    email: [EMAIL PROTECTED]
Masaryk University             http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
--------------------------------------------------------------

Odpovedet emailem