2017-06-03 3 views
0

ich meine Frage mit einem Beispiel desrcibe wollen:Java: Objekte, die immer den gleichen Inhalt haben?

Base.java:

public class Base { 

    //NO annotations 
    public AnyClass anyObj; 

    public Base(){} 
} 

DerivedOne .java-:

public class DerivedOne extends Base{ 

    @SomeAnnotionsOne 
    public AnyClass anyObjWithAnnotations; 

    public DerivedOne (AnyClass anyObj){ 
     this.anyObj = anyObj; 
     anyObjWithAnnotations = this.anyObj; 
    } 
} 

DerivedTwo.java:

public class DerivedTwo extends Base { 

    //These annoations differ from @SomeAnnotionsOne 
    @SomeAnnotionsTwo 
    public AnyClass anyObjWithAnnotations; 

    public Derived_Two(AnyClass anyObj){ 
     this.anyObj = anyObj; 
     anyObjWithAnnotations = this.anyObj; 
    } 
} 

Also ich will nur anyObjWithAnnotations immer gleich sein anyObj.

Beispiel main:

public static void main(String[] args){ 
    DerivedOne derivedObj = new DerivedOne(new AnyClass()); 
    derivedObj.anyObj = null; 

    if(derivedObj.anyObjWithAnnotations == null){ 
     System.out.println("anyObjWithAnnotations : is null"); 
    } 
} 

Es wird nichts gedruckt. ist null, anyObjWithAnnotations ist nicht.

Meine Frage:

Ist es möglich, dass anyObj als anyObjWithAnnotations immer das gleiche ist ??

Also auch wenn ich eine von ihnen auf null oder erstellen Sie eine neue Instanz von AnyClass mit new die andere Variable sollte den gleichen neuen Inhalt haben.

EDIT:

Changed ganze Beispiel das Problem zu klären.

+0

'myObj1 = myObj2' ?? Warum möchten Sie zwei zwei verschiedene Objekte mit genau demselben Wert haben? – luk2302

+0

können Sie eine gleiche Referenz für beide Objekte verwenden. –

+0

@ luk2302 dies funktioniert nicht für mich .. 'myObj2: ist null' wird nie gedruckt .. es ist ein ganz besonderer Fall mit XML-Annotationen: myObj1 ist in einer Basisklasse definiert und ich brauche es in einer abgeleiteten Klasse – Truntle

Antwort

2

Sie können den folgenden Code verwenden, wo ich nur Objekt 1 erstellen und dann seine Referenz in zweites Objekt zuweisen. Wenn auf diese Weise ein Wert in einem Objekt geändert wird, in Beispiel t1, wird er ebenfalls in t2 reflektiert.

class Test { 
    private int val; 

    public Test(int val) { 
     this.val = val; 
    } 

    public int getVal() { 
     return val; 
    } 

    public void setVal(int val) { 
     this.val = val; 
    } 
} 
public class TestSame { 
    public static void main(String[] args) { 
     Test t1 = new Test(10); 
     Test t2=t1; 
     System.out.println(t1.getVal()); 
     System.out.println(t2.getVal()); 

     t1.setVal(20); 

     System.out.println(t1.getVal()); 
     System.out.println(t2.getVal()); 

    } 
} 

O/P: -

10 
10 
20 
20 

Sie können auch prüfen, ob beide T1 und T2 denselben Hash-Code Wert

System.out.println("t1 hashcode "+ t1.hashCode()); 
    System.out.println("t2 hashcode "+ t2.hashCode()); 
+0

das funktioniert gut Unitl Sie setzen 'myObj1' auf' null' .. 'myObj2' wird nicht an dieser Stelle ändern ..' myObj2: ist null' ist nie gedruckt – Truntle

+0

yup, wenn Sie dies tun, sollten Sie nicht ändern die Referenz, sollten Sie immer Getter und Setter verwenden, um den Zustand des Objekts zu ändern. –

+0

Ich habe mein Beispiel geändert. Können Sie mir sagen, ob das möglich ist? Wenn ja, wie kann ich es erreichen? Danke – Truntle

0

hat Sieht aus wie Sie einen Singleton benötigen.

public class Singleton { 
    private int val = 0; 

    public void setVal(int val) { 
     this.val = val; 
    } 
    public static final Singleton INSTANCE = new Singleton(); 

    private Singleton() { } 

    public static Singleton getInstance() { 
     return INSTANCE; 
    } 
} 

Anwendungsbeispiel:

Singleton s1 = Singleton.getInstance(); 
Singleton s2 = Singleton.getInstance(); 

s1.setVal(42); 

Wenn Singleton zu viel für Ihren Fall ist Sie Ansatz verwenden:

Object obj1 = new Object(); 
final Object obj2 = obj1; 

seit obj2 letzte Referenz - der Lage sein, die Sie nicht ändern (neu zuweisen). So verweisen obj2 und obj1 die gleiche Objektinstanz.Aber es ist möglich, obj1 Referenz neu zuzuweisen. Wenn Sie final sowohl obj1 als auch obj2 einstellen, erhalten Sie genau das, was Sie wollen.

final Object obj1 = new Object(); 
final Object obj2 = obj1; 
+0

Singleton Muster wird nicht in meinem Fall helfen. Zu deinem zweiten Vorschlag: 'myObj2: is null' wird nie gedruckt. Wenn' myObj1' 'null' ist, sollte' myObj2' auch sein! – Truntle

+0

Es wird null sein. Sie können Referenzen nach der ersten Zuweisung nicht ändern. aber wenn Sie zuweisen: 'final Object obj1 = null '- es wird Null sein –

+0

scheint Sie eine Singleton Verwendung nicht verstehen: Wenn Sie setVal (null) - es wird in' beiden 'Objekte ändern –

Verwandte Themen