2009-08-09 4 views
4

Sorry für die dumme Frage.Gibt es eine Standardklasse, die einen Verweis umschließt und einen Getter und Setter bereitstellt?

Ich bin mir sehr sicher, dass die Java-API eine Klasse bereitstellt, die einen Verweis umschließt und einen Getter und einen Setter bereitstellt.

class SomeWrapperClass<T> { 
    private T obj; 

    public T get(){ return obj; } 

    public void set(T obj){ this.obj=obj; } 
} 

Bin ich richtig? Gibt es so etwas in der Java API?

Vielen Dank.

Ja, ich könnte es selbst schreiben, aber warum sollte ich bestehende Funktionalität nachahmen?

EDIT: Ich wollte es als Referenz verwenden Parameter (wie die ref Schlüsselwort in C#) oder spezifischere, der Lage sein, zu "Verfahrensparameter schreiben";)

+0

wofür möchten Sie das verwenden? – Zed

Antwort

0

Es gibt java.lang.ref.Reference, aber es ist unveränderlich (Setter fehlt). Die Dokumentation java.lang.ref lautet:

Jedes Referenzobjekt enthält Methoden zum Abrufen und Löschen der Referenz. Abgesehen von der Löschoperation sind Referenzobjekte ansonsten unveränderbar, so dass keine festgelegte Operation bereitgestellt wird. Ein Programm kann diese Unterklassen weiter unterklassifizieren, indem es alle Felder und Methoden hinzufügt, die für seine Zwecke erforderlich sind, oder es kann diese Unterklassen ohne Änderung verwenden.

EDIT

void refDemo(MyReference<String> changeMe) { 
    changeMe.set("I like changing!"); 
    ... 

der Anrufer:

String iWantToChange = "I'm like a woman"; 
Reference<String> ref = new MyReference<String>(iWantToChange) 
refDemo(myRef); 
ref.get(); 

ich es nicht aber mag, zu viel Code. Diese Art von Features muss auf Sprachenebene wie in C# unterstützt werden.

7

Es gibt die AtomicReference-Klasse, die diese zur Verfügung stellt. Es besteht hauptsächlich, um Atomizität sicherzustellen, besonders mit den getAndSet() - und compareAndSet() -Methoden, aber ich denke, dass es tut, was Sie wollen.

+0

Sind Funktionen langsamer als nicht-atomare Funktionen schreiben? –

+0

Sie müssen etwas langsamer sein, da sie definitionsgemäß threadsicher sind und daher eine gewisse Form der Synchronisation benötigen. – extraneon

+2

Obwohl ich sie im Zusammenhang mit den Methodenparametern einmal einstellen kann, kann ich mir kaum vorstellen, dass dies möglicherweise einen spürbaren Unterschied machen könnte. Es wäre definitiv eine vorzeitige Optimierung, aus diesem Grund Ihre eigenen zu schreiben. Klarheit könnte ein besserer Grund sein - Sie möchten keine AtomicReference, Sie möchten eine Referenz. – Avi

0

Ich bin nicht klar, was das sein würde, aber Sie könnten eine der Unterklassen der Reference Art verwenden. Sie legen die Referenz im Konstruktor und nicht als Setter fest.

Es ist erwähnenswert, dass die Reference-Unterklassen in erster Linie dazu gedacht sind, die Speicherbereinigung zu erleichtern, zum Beispiel in Verbindung mit WeakHashMap.

+0

@Rich: ja du könntest. Aber diese Unterklassen haben spezifische Semantiken (und damit verbundene Gemeinkosten), die sie hier zur falschen Antwort machen. –

+0

@Stephen Das ist ziemlich viel, was ich im zweiten Absatz sage, nicht wahr? –

+0

@Rich. Ich denke nicht. Das ist nicht, was deine Worte sagen, oder (IMO) sogar was sie bedeuten. –

0

Ich bin versucht zu fragen, warum Sie eine von diesen wollen, aber ich nehme an, es ist so, dass Sie mehrere Objekte aus einer Funktion zurückgeben können ...

Jedes Mal, wenn ich will, habe, das zu tun, habe ich ein Array oder ein Containerobjekt verwendet ...

bool doStuff(int params, ... , SomeObject[] returnedObject) 
{ 
    returnedObject[0] = new SomeObject(); 
    return true; 
} 

void main(String[] args) 
{ 
    SomeObject myObject; 
    SomeObject[1] myObjectRef = new SomeObject[1]; 
    if(doStuff(..., myObjectRef)) 
    { 
     myObject = myObjectRef[0]; 
     //handle stuff 
    } 
    //could not initialize. 
} 
0

Wenn Sie mehrere Werte aus einer Funktion zurückkehren wollen, würde ich ein Paar erstellen , Triple, & c-Klasse, die sich wie ein Tupel verhält.

class Pair<A,B> { 
A a; 
B b; 
public void Pair() { } 
public void Pair(A a,B b) { 
this.a=a; 
this.b=b; 
} 
public void Pair(Pair<? extends A,? extends B> p) { 
this.a=p.a; 
this.b=p.b; 
} 
public void setFirst(A a) { this.a=a; } 
public A getFirst() { return a; } 
public void setSecond(B b) { this.b=b; } 
public B getSecond() { return b; } 
} 

Dies würde erlauben Sie 2 (techically unendlich) Rückkehr

Werte
/* Reads a line from the provided input stream and returns the number of 
* characters read and the line read.*/ 
public Pair<Integer,String> read(System.in) { 
... 
} 
1

Als ich Programmierung in Java nach Jahren des Schreibens C begann zurückzukehren ++, ich mit der Tatsache betroffen war, dass ich nicht zurückkehren konnte mehrere Objekte aus einer Funktion.

Es stellte sich heraus, dass es nicht nur möglich war, sondern auch das Design meiner Programme verbesserte.

Die Java-Implementierung von CORBA verwendet jedoch Einzelelement-Arrays, um Dinge als Referenz zu übergeben. Dies funktioniert auch mit Grundtypen.

0

Ich denke, es gibt keine Java API Klasse für Ihre Absicht, ich würde auch Ihr Beispiel (die Wrapper-Klasse) dann mit diesem "Array-Trick" bevorzugen, weil Sie später einige Wachen einfügen oder mehrere Thinks über Aspekte überprüfen können oder Reflektion und Sie können Funktionen hinzufügen, die übergreifend wichtig sind.

Aber seien Sie sicher, dass Sie das wollen! Vielleicht könntest du neu gestalten und zu anderen Lösungen kommen?