2017-06-17 82 views
0

我是Java的初學者,所以我不知道我試圖訪問的是上層/包裝類。基本上,我有三個類A,B和C.上層/包裝類的訪問變量

CLASS A.java

public class A{ 

private String aName; 

private B objectB; 

} 

CLASS B.java

public class B{ 

    private String bName; 

    private C objectC; 

    } 

CLASS C.java

public class C{ 

     private String cName; 


     } 

基本上,我有一個類A,它具有類B的對象,而類B的對象又具有類C的對象。我有一個類C的對象的實例。如何從此訪問變量bName和cName對象C的實例嗎?

+0

Java並不是我的主要領域,但是在C類可以讀取任何A或B變量之前,您是否必須將A類和B類導入C類?還有一個持有C類實例的第4個(Main?)類? –

+0

是的,我正在使用android,所以這第四類基本上是我在訪問對象C的Activity。關於導入,是否可以訪問創建當前對象的類的特定實例? –

+0

A類必須'導入classB;'以便'private B someVar;'是有意義的。類B導入類C以創建'objectC'的實例...當類C導入其他兩個類時,您將創建它們的實例。例如:'私人的instA;''所以與'instA'作爲參考您可以訪問變量作爲'myString = instA.aName;'或'myString = instB.bName;'等等的變量... –

回答

1

爲什麼不使用getter & setter方法從c實例中訪問變量bName。你不能直接訪問他們,因爲他們是私人的。

「CLASS B.java」

public class B{ 

private String bName; 

public String getbName() { 
    return bName; 
} 

public void setbName(String bName) { 
    this.bName = bName; 
} 

private C objectC; 

} 

因爲這個變量是屬於到c您正在使用,以獲得BNAME的相同obejct您可以直接訪問「CNAME」變量。

+0

是的,我可以那樣做但是我使用gson從json創建POJO。所以gson自己反序列化對象,爲此我需要在對象中訪問變量。或者我有一種方法來在gson中設置變量? –

+0

如果可能,請發佈json –

1

用於獲取到B類C類實例訪問的最簡單的解決辦法是增加一個引用C到B:

C類

public class C { 

    private String cName; 
    private B bObj; 

} 

而然後使用類B中的吸氣劑和吸附劑:

B類

public class B { 

    private String bName; 
    private C cObj; 

    public String getBName() { 
     return bName; 
    } 

    public void setBName(String newName) { 
     this.bName = newName; 
    } 
} 

但是,請記住,這將導致循環依賴,這通常是一個代碼味道(可能在這種情況下是正常不過,這取決於整個類層次結構)。


更好的選擇是執行中的類之間的觀察者模式:

C類

public class C { 

    private String cName; 
    private List<Observers> observers; //if you only need one instance, then 
             //switch out for a single interface reference 

    public void requestWrapperName() { 
     List<String> names = new ArrayList<>(); 
     for(observer: observers) { 
      names.add(observer.requestName()); 
     } 
     // code to do what you want with wrapper name 
     ... 
    } 

    public void addObserver(Observer observer) { 
     observers.add(obsersver); 
    } 

} 

Observer接口

public interface Observer { 
    String requestName(); 
} 

B類

public class B implements Observer { 

    private String bName; 
    private C cObj; 

    // Observer method 
    public String requestName() { 
     return bName; 
    } 
} 

現在,當你有C的情況下在B類,你可以注入B中的觀察者與cObj.addObserver(this); C,然後請求B的名字與方法requestWrapperName();。因此避免同時存在兩種關聯:)