[英]DESIGN PROBLEM: How to use composition the best
我正在做一個項目,對它的設計有些懷疑。 我怎樣才能最好地設計以下問題(在 JAVA 中):
Class A具有以下屬性:
Class B與以下 function:
當我在 class 中時,AI 想在 A 中的每個像素上使用 B.function 並僅當它不存在時才將其添加到 HashSet 中。 問題是,我不想將主題集發送到ZC1C425268E68385D1AB5074C174F14F14Z,從ZC1C425268E68E68385D1AB5074C174C17A94F14的情況下返回新的Pixel新實例(如果已經存在),那么它可能已經存在了這一點,這是有多糟糕的。像素)。
我還有什么其他選擇?
由於您使用Set<Pixel>
您必須創建新的Pixel
實例來檢查它是否存在於集合中。
如果在調用B.function
方法后集合包含N
個元素,您將創建額外的N
個Pixel
節點。 如果所有元素都是新的,您只需將它們添加到 set 中, Garbage Collection
需要清除它們。 缺點之一是我們需要創建m
(其中m <= N
- 集合中已經存在的Pixel
-s 的數量),然后我們需要通過GC
收集它們。 m/N
比率有多大取決於您的算法和您實際在做什么。
讓我們計算在集合中N = 1_000_000
像素需要消耗多少 memory。 我們知道int
是4 bytes
, double
是8 bytes
,讓我們為 object 添加額外的8 bytes
和8 bytes
作為參考。 它為Pixel
object 的每個實例提供32 bytes
。 我們需要創建N
個提供32MB
的對象。 假設我們的比率是50%
,所以我們分配16MB
只是為了檢查它是不需要的。
如果這是您無法支付的成本,則需要開發允許您按left-to-right
的順序迭代Set<Pixel>
的算法。 因此, Pixel
X
的左鄰居在X
之前。
假設Pixel
X(x, y)
的左鄰居是像素X'(x - 1, y)
。 Pixel
B(0, y)
沒有左鄰。 您需要使用TreeSet
並在Pixel
class 中實現Comparable<Pixel>
接口。 簡單的實現可能如下所示:
@Override
public int compareTo(Pixel o) {
return this.y == o.y ? this.x - o.x : this.y - o.y;
}
這允許您按從左到右的順序迭代集合: (0, 0), (1, 0), ...., (x - 1, y), (x, y), (x + 1, y), ... , (maxX, maxY)
。 因此,當您迭代它時,您可以檢查前一個元素是否是當前Pixel
的左鄰居。 示例實現可能如下所示:
void addNeighboursIfNeeded() {
Set<Pixel> neighbours = new HashSet<>(pixels.size());
Pixel last = null;
for (Pixel p : pixels) {
if (p.getX() == 0 || p.isLeftNeighbour(last)) {
// a left border pixel
// or last checked element is a left neighbour of current pixel.
last = p;
continue;
}
// last element was not our left-neighbour so we need to call b method
Pixel left = b.getLeft(p);
neighbours.add(left);
last = p;
}
// add all new neigbours
pixels.addAll(neighbours);
}
這應該允許您保存分配給重復Pixel
對象的 memory。
我可以在這里看到一些關於 object 面向編程的擔憂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.