Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

Returnera objekt av samma typ som anropad klass

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1

Hej.

Jag har stött på ett problem med Java. Jag har ett antal klasser som alla ärver av en abstrakt klass. Varje klass har en metod som heter createObject() som skapar en ny instans av klassen och returnerar denna. Denna klass fungerar just nu likadant i varje klass med skillnad på att de returnerar ett objekt av sin egen typ.

Det skulle jag vilja ändra på. Jag försöker skapa en enda metod i huvudklassen som allokerar ett objekt och returnerar det, men att det blir ett objekt av rätt typ.

T ex kanske jag har en klass som heter Klass, som i sin tur ärver av klassen Huvudklass. Om jag vill ha en ny instans av Klass skriver jag:

Klass obj = Klass.createObject();

Metoden finns i Huvudklass, men jag lyckas inte få Huvudklass att returnera ett objekt av typen Klass utan att det blir problem för andra klasser som också vill komma åt createObject().

jag tycker att det låter som ett skumt sätt att skapa objekt. finns det någon anledning att inte använda det 'vanliga' new...?

  • Medlem
  • 2007-07-17 22:20

Går delvis

this.getClass().newInstance() ger dig en ny instans av det aktuella objektets klass.

Dock kan du inte få funktionen createObject() att ha en annan typ än HuvudKlass utan att överlagra den i Klass. Du får ful-casta lite.

EDIT

Såg att du ville ha en statisk metod. Kan ej ge dig ett svar då, men jag låter ovanstående stå kvar så du vet var du ska leta.

  • Medlem
  • 2007-07-17 22:47

Det går tydligen med en rejäl dos fulhack att göra detsamma i en statisk metod, men det är troligen inte att rekommendera då det är rejält fult. Här kommer koden iaf

Exception e = new Exception();
StackTraceElement[] = e.getStackTraceElements();
String className = sTrace[0].getClassName();
return Class.forName(className).newInstance();

Exception skapas enbart för att komma åt StackTraceElements vilken innehåller klassnamnet i index 0. Däremot kan du fortfarande inte få metoden att returnera någonting annat än HuvudKlass.

Skulle rekommendera att istället implementera createObject() i varje subklass. Ta en titt på ett design-pattern som kallas "Factory Method".

Jag tror jag har lite bättre koll nu på hur jag ska göra. Tack.

1
Bevaka tråden