Java - Instanz zurück geben

  • Java

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Java - Instanz zurück geben

    Wie ich gelesen habe, werden z.B. Parameter immer by value übergeben. Wenn ich jetzt folgende Funktion habe:

    Java-Quellcode

    1. public ZBufferData getBufferData()
    2. {
    3. return zbufferData;
    4. }


    Wird da auch nur eine Value übergeben? Wenn ja - wie komme ich stattdessen an die Referenz?
    Aus dem Beispiel aus Post #2 werde ich irgendwie nicht schlau.. Ich habe eine "Property" die ich zurück geben möchte, und der Benutzer kann da etwas verändern. Da es aber return by value ist, bringt das absolut gar nichts. Also wie kann ich mein vorhaben anders realisieren?

    Java-Quellcode

    1. public class Main {
    2. public static void main(String[] args) {
    3. // TODO Auto-generated method stub
    4. ZBufferData data = createBuffer();
    5. System.out.println(data.getDescription());
    6. System.out.println(data.getData());
    7. work(data);
    8. System.out.println(data.getDescription());
    9. System.out.println(data.getData());
    10. }
    11. private static ZBufferData createBuffer()
    12. {
    13. ZBufferData data = new ZBufferData();
    14. data.setDescription("BackBuffer helper.");
    15. data.setData(1024);
    16. return data;
    17. }
    18. private static void work(ZBufferData data)
    19. {
    20. data.setDescription("changed..");
    21. data.setData(2048);
    22. }
    23. }
    24. Produziert folgenden output:
    25. [code]
    26. BackBuffer helper.
    27. 1024
    28. changed..
    29. 2048


    Es funktioniert also.. Wieso regen sich dann alle auf das Java pass und return by value ist?
    [/code]
    Das geht glaube ich so nicht, du müsstet es mit einem Setter Setzen. Etwa So

    Java-Quellcode

    1. public class Main {
    2. public static void main(String[] args)
    3. {
    4. Example e = new Example("Mustermann", "MusterValue");
    5. System.out.println(e.GetName());
    6. e.SetName("NeuerName");
    7. System.out.println(e.GetName());
    8. }
    9. }
    10. class Example
    11. {
    12. public String Name;
    13. public String Value;
    14. public Example(String Name, String Value)
    15. {
    16. this.Name = Name;
    17. this.Value = Value;
    18. }
    19. public String GetName()
    20. {
    21. return Name;
    22. }
    23. public String ResturnValue()
    24. {
    25. return Value;
    26. }
    27. public void SetName(String Name)
    28. {
    29. this.Name = Name;
    30. }
    31. public void SetValue(String Value)
    32. {
    33. this.Value = Value;
    34. }
    35. }
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    ThuCommix schrieb:

    Wieso regen sich dann alle auf das Java pass und return by value ist?
    Return ist immer by value. Das gilt in Java genauso wie in jeder anderen C-verwandten Sprache (auch in C#). Wenn eine Referenz kopiert wird, dann zeigt der neue Pointer aber logischerweise auf selbe Objekt, ist also eine Referenz auf das selbe Objekt, an dem du auch ganz normal Änderungen vornehmen kannst. Du kannst aber nicht den ursprünglichen Pointer ändern (genau wie in C#), denn bei einer Zuweisung änderst du nur die Kopie des Pointers, du hast dann also eine neue Referenz. In C++ könntest du einen Pointer auf einen Pointer benutzen, also eine Referenz auf eine Referenz, aber in Java und C# gibts sowas nicht, weswegen meine Aussage, es verhält sich exakt so wie in C#, absolut korrekt ist. Und wies da funktioniert, weißt du hoffentlich.
    Soweit ich weiß hat Java keine Stacksemantik für Klasseninstanzen und Copykonstruktoren wie C++ (ausserdem würde man nichtmal ne Referenz oder Zeiger/Zeiger auf Zeiger zurückgeben sondern den Movekonstruktor bemühen), deswegen kann man diese auch garnicht by Value übergeben.
    Was mich bei Java eher aufgeregt hat, war dass Primitive Typen nicht als Referenz übergeben werden können:

    Java-Quellcode

    1. void bla(int x)//gibt kein ByRef oder & oder Pointer oder son mist
    2. {
    3. x = 123;
    4. }
    5. void bla1(int x[])//geht, da nicht primitiv
    6. {
    7. x[0] = 123;
    8. }
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Artentus schrieb:

    Es gibt nichtmal Events, weils keine Delegaten gibt.


    Nö, das ist ein Luxus von .Net das macht man mit Listenern. Ein Listener ist einfach ein Interface das an den Code Stellen aufgerufen werden soll. Etwa So

    Java-Quellcode

    1. public interface TestListener {
    2. void returnName();
    3. void returnValue();
    4. void setName();
    5. void setValue();
    6. }


    und die Klasse

    Java-Quellcode

    1. public class Main {
    2. public static void main(String[] args)
    3. {
    4. Main m = new Main();
    5. Example e = new Example("Mustermann", "MusterValue");
    6. e.addListener(m.listener);
    7. System.out.println(e.GetName());
    8. e.SetName("NeuerName");
    9. System.out.println(e.GetName());
    10. }
    11. public TestListener listener = new TestListener()
    12. {
    13. public void returnName() {
    14. // TODO Auto-generated method stub
    15. System.out.println("Return Name Event");
    16. }
    17. public void returnValue() {
    18. // TODO Auto-generated method stub
    19. System.out.println("Return Value Event");
    20. }
    21. public void setName() {
    22. // TODO Auto-generated method stub
    23. System.out.println("Set Name Event");
    24. }
    25. public void setValue() {
    26. // TODO Auto-generated method stub
    27. System.out.println("Set Value Event");
    28. }
    29. };
    30. }
    31. class Example
    32. {
    33. private TestListener Listener;
    34. public String Name;
    35. public String Value;
    36. public Example(String Name, String Value)
    37. {
    38. this.Name = Name;
    39. this.Value = Value;
    40. }
    41. public String GetName()
    42. {
    43. if(this.Listener != null)
    44. {
    45. this.Listener.returnName();
    46. }
    47. return Name;
    48. }
    49. public String ResturnValue()
    50. {
    51. if(this.Listener != null)
    52. {
    53. this.Listener.returnValue();
    54. }
    55. return Value;
    56. }
    57. public void SetName(String Name)
    58. {
    59. if(this.Listener != null)
    60. {
    61. this.Listener.setName();
    62. }
    63. this.Name = Name;
    64. }
    65. public void SetValue(String Value)
    66. {
    67. if(this.Listener != null)
    68. {
    69. this.Listener.setValue();
    70. }
    71. this.Value = Value;
    72. }
    73. public void addListener(TestListener listener) {
    74. Listener = listener;
    75. }
    76. }
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener