簡體   English   中英

JAVA中的封裝級別

[英]Level of encapsulation in JAVA

我正在一個項目中,不想訪問最內層的類。 這是我正在使用的類結構,

// data types are not important unless mentioned
class One
{ 
    protected propertyOne;
    protected String id; 
}

class Two
{
    protected ArrayList<One> arrayOne;
    protected String id;
}

class Three
{
    protected ArrayList<Two> arrayTwo;
    protected otherProperty;
}

現在,主類將實例化3,並應通過成員方法使用2和1。 如果我通過get函數返回ArrayList任何一個,則可以從任何地方輕松更改所有數據。 因此,我返回ArrayList<Two.id>而不是ArrayList<Two> ,然后使用特定的Two.id調用另一個方法。 這可以使ArrayList保持隱藏狀態,但是由於ArrayList<Two.id>ArrayList<One.id>生成大量代碼和額外的對象。

在C ++中,我本可以使用const返回類型的const方法來確保ArrayList沒有變化。

Java中有什么聰明的方法可以隱藏ArrayList

基於休眠的API也有類似的問題。 我們希望不可能進行“意外”更改,從而強制使用服務以將業務邏輯保留在一個位置,並在API級別強制進行某些訪問控制。

我們確實使用代理和派生的Readonly接口解決了此問題。

因此,如果在Two具有屬性,則在ReadonlyTwo接口中聲明getX方法。 每當您返回列表Two ,就聲明該列表為ReadonlyTwo 程序員可以通過學習API來解決這個問題,他將看到對象何時真正為Two並可以進行類型轉換。 如果要避免這種情況,則必須將代理包裝在實際的Two對象周圍,並實現ReadonlyTwo接口。

如果現在將列表作為不可變列表返回,則您的API可以安全地進行外部修改,甚至是對象級別。

// data types are not important unless mentioned
class One implements ReadonlyOne
{ 
    protected propertyOne;
    protected String id; 
}

class Two implements ReadonlyTwo
{
    protected ArrayList<? extends ReadonlyOne> arrayOne;
    protected String id;
}

class Three implements ReadonlyThree
{
    protected ArrayList<? extends ReadonlyTwo> arrayTwo;
    protected otherProperty;
}

接口看起來像這樣(您沒有添加任何getter / setter方法,因此我在這里進行了編排):

interface ReadonlyThree {
    List<? extends ReadonlyTwo>getArrayTwo();   
}

您的應用程序對象需要業務方法來處理“ Two和“ One對象的修改:

interface ThreeService {
    ReadonlyTwo addTwo(p1, p2, p3) throws BusinessException;
    void removeTwo(ReadonlyTwo twoRO) throws BusinessException;
    List<? extends ReadonlyTwo>findTwoByPredicate(Predicate p) throws BusinessException;
}

暫無
暫無

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

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