Java Objekt einer Klasse ohne new() erzeugen

magoit

Cadet 2nd Year
Registriert
Okt. 2010
Beiträge
19
Hallo,

ich habe folgende Klasse:

Code:
class Test{
String test="default";

  public Test(String s)
  {
     test=s;
  }

}

In einer weiteren Klasse habe ich eine static-Referenz auf diese Test-Klasse. Ist es möglich mit dieser Referenz ohne Verwendung des new()-Operators ein Objekt der Test-Klasse zu erzeugen?

Ich habe bereits erfahren, dass die String-Wrapperklasse in Java auch ohne den new()-Operator klarkommt. Wie wird das dort realisiert?

Gruß und danke im Vorraus,
magoit
 
Nein. Mit new werden Objekte erzeugt. Immer.

Nur weil es nicht immer explizit da steht, heißt das nicht, dass da irgendwo implizit ein new aufgerufen wird. Java ist ja recht bequem, was Automatismen (automatische Casts, usw) angeht.
Strings der String-Klasse sind intern eigentlich Char-Arrays und die werden auch per new erzeugt.
String test="default"; wird vom Interpreter als String test = new String("default"); übersetzt.

Ich kann mir nicht vorstellen, die ganze Objektorientierung einer Sprache auf new aufzubauen, um dann hinterher bei einer bestimmten Klasse eine Ausnahme zu machen.
 
Etwas mehr Infos wären gut. Ansonsten denke ich wenn ich das nehme was du preis gegeben hast, dass das Singleton Pattern nützlich wäre.

Das sieht dann wie folgt aus.

public class Test{
private static Test instance = null;

private Test() {}

public static Test getInstance(String s) {
if (instance == null) {
instance = new Test(s);
}
return instance;
}
}

Warum willst du denn new() loswerden?
 
Du kannst nicht "auf diese Klasse" static referenzieren. Du referenzierst immer auf ein Objekt dieser Klasse. Und das erklärt ja schon dass du erstmal ein Objekt instanzieren musst.
 
Moin moin.

Alternativ wäre auch folgendes Möglich:
Code:
try {
 instanz.getClass().newInstance();
}
 catch (InstantiationException e) {}
 catch (IllegalAccessException e) {}

Erfordert aber das deine Klasse von der ein Objekt erzeugt werden soll einen parameterlosen Konstruktor hat und dieser die notwendige Sichtbarkeit hat.

Wenn du wirklich eine Instanz auf die Klasse im Sinne von "Class<?> Klassenreferenz" hast, geht es analog: Klassenreferenz.newInstance().

Alternativ ginge es auch über Reflections. Du holst dir zuerst das Klassenobjekt, wählst dann den passenden Kosntruktor und erzeugst mit ihm ein Objekt. Dabei kannst du dann auch Parameter übergeben.
Bsp.:
Code:
try {
 instanz.getClass().getConstructors()[0].newInstance(null);
 } catch (IllegalArgumentException e) {
  e.printStackTrace();
 } catch (SecurityException e) {
  e.printStackTrace();
 } catch (InvocationTargetException e) {
  e.printStackTrace();
}

Weitere Informationen unter:
http://download.oracle.com/javase/6/docs/api/java/lang/Class.html
 
Ehh, Meckie... deine Singleton Lösung ist in nicht Threadsicher und kann hickhack wegen Serialisierung geben (siehe Prentice Hall - Effective Java 2nd Edition) => sollte man eigentlich bei dem Designpattern vermeiden.
Die bessere Lösung wäre mit Hilfe einer Enumeration ein Objekt zu erstellen:

Code:
public enum Foo {
	INSTANCE;

	public void bar() { ... }
}

Im Code brauchste nicht mal extra einen Aufruf zum instanzieren machen... Methoden rufst du direkt auf:

Code:
Foo.INSTANCE.bar();

Dies ist die beste Art mitlerweile in Java Singletons zu erstellen, so die aktuelle Literatur.
 
Zuletzt bearbeitet:
Ahh interessant. Find ich gut. In der Uni lernt man ja nur alt Sachen. Das Buch klingt nicht schlecht.
Was ist wenn ich jetzt aber den Singleton mit einem Parameter erzeugen will. Aus welchem Grund auch immer.... bastle ich mir dann eine create Methode mit param der nur einmal gesetzt werden kann? oder wie?
 
Das ist eine durchaus interessante Frage :)
Du willst bei der quasi-Initialisierung des Singleton ein (paar) Parameter setzen.

Ich muss dazu sagen: Es IST möglich, aber vollkommen sinnfrei, denn:
- Jeder Zugriff auf das Singleton (von jedem Objekt aus) müsste diesen Parameter mit übergeben, da du ja nicht wissen kannst, welches Objekt den ersten Zugriff macht
- Wenn du doch weiß, wer zuerst das Objekt benutzt, dann brauchst du auch kein Singleton mehr ;) Dann kannst du deine Singleton-Klasse auch als quasi Innere-Klasse des Erzeugers nutzen und jeder muss über den Erzeuger an das Objekt gelangen.

- Wenn dein Singleton komplett Thread-Safe ist (d.h. für mich, dass es immer nur von einem Objekt zu einem Zeitpunkt genutzt werden kann), dann könntest du deinen parametrisierten Konstruktor einbinden und der macht nur etwas, solang die einmalig zu setzenden Variablen nicht 'null' (oder belibiger anderer Initialwert) sind. Ist aber ziemlich häßlich!


Könntest du vielleicht ein Beispiel nennen, wo man im Singleton einen Parameter nutzen könnte? Ich kann mir absolut nichts vorstellen :(

Grüße
 
Puhh. hmm vielleicht folgendes:

Ich will von einer Klasse X nur eine Instanz. Diese benötigt aber Zugriff auf eine bestimmte Variable v, die nur einer anderen Klasse A bekannt ist. Man möchte aber vermeiden, dass auf diese Variable von außen drauf zugegriffen werden kann. Somit erzeuge ich X in dieser Klasse A und übergebe X v als Parameter.
Jetzt möchte ich das alle anderen Klassen auf X zugreifen können und irgendwelche operationen ausführen können dabei muss ihnen v nicht bekannt sein...

Ich weiß nicht ob das verständlich genug ist. Ok man könnte jetzt sagen warum macht man nicht alles in A. Darauf wäre meine Antwort jetzt erstmal wegen der Übersicht. Ich habe genau so einen fall. ich habe bei mir jetzt zwei Methoden in X und zwar einmal createInstance(v) und getInstance().
Da habe ich mich auch schon gefragt wie man das eleganter lösen kann.
Die Klasse X übernimmt bei mir eine spezielle Aufgabe die ich bspw. nicht noch in der Klasse A unterbringen will, da es sehr umfangreich ist.
Als Hinweis vielleicht noch. Sowohl X als auch A sind bei mir Singleton.
Vielleicht kennst du eine Alternative für mich.

edit: was mich an der Art und Weise von dem mit enum iritiert ist noch das erste initialisieren. Wo packe ich den jetzt bspw. Operationen rein die bei der Erzeugung passieren müssen?
edit2: Ah hab schon. Komische Sache. Das muss ich mir nochmal durchlesen.

Grüße
Meckie
 
Zuletzt bearbeitet:
Zurück
Oben