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
--------------------------------------------------------------