簡體   English   中英

對java中對象的雙重引用

[英]double references to an object in java

有一節課:

public class Rectangle {
    public int width = 0;
    public int height = 0;
    public Point origin;

    public Rectangle(Point p) {
        origin = p;
    }
}

可以看出,該類有一個Point類型的對象。 當我聲明一個Rectangle類型的對象時,

Rectangle rectOne = new Rectangle(originOne)

其中originOne的類型為Point,然后在初始化對象之后,我將對originOne的Point引用有兩個不同的引用,即rectOne.origin和originOne。 如果為了使代碼更安全,我想擺脫其中一個變量怎么辦? 有沒有辦法做到這一點,除了編寫構造函數,以便不創建額外的對象?

如果為了使代碼更安全,我想擺脫其中一個變量怎么辦?

你是以一種奇怪的方式問這個問題。 我認為你想通過稍后改變originOne來確保某人不能影響rectOne

有沒有辦法做到這一點,除了編寫構造函數,以便不創建額外的對象?

您的解決方案在您的問題中:創建一個額外的對象。

public Rectangle(Point p) {
    origin = new Point(p.x, p.y);
}

要么

public Rectangle(Point p) {
    origin = p.clone();
}

它必須支持最后一個的clone方法。 有關涉及的內容,請參閱或其他參考。

如果你想在不創建另一個對象的情況下這樣做,(1)你可能不能,(2)你為什么限制自己創建對象? 這就是OO編程的全部內容。


你對String的關注並不常見。 為什么? 因為它們是不可改變的。

另一個(IMO更好)解決方案是使Point類不可變

public class Point { // possibly add "final class" 
    final int x;
    final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

現在沒有人可以改變Point ,你的代碼變得“更安全”。

當您按照您的方式編寫代碼時,沒有創建Point類的額外對象,您只需創建對存儲在新變量中的同一對象的新引用。

如果要確保不創建對同一Point對象的附加引用,可以將該點的X和Y傳遞給Rectangle類,並在構造函數中創建一個新對象:

public Rectangle(int x, int y) {
    origin = new Point(x, y);
}

這樣就很清楚你沒有存儲對傳遞參數的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM