[英]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.