2009-12-15 45 views
0

出於好奇,我想知道Java中是否存在任何類,並使用返回其數據結構副本的方法。我問,因爲在課堂上,老師說這樣的方法打破了隱私,但是我認爲如果你想重新安排結構,那麼獲得結構的副本是有用的。我想要一個例子。謝謝。一個類的內部數據結構的副本

+0

你能否進一步解釋什麼是結構的「複製」?你有一個簡單的例子嗎? – OscarRyz 2009-12-15 21:24:42

+0

您的意思是運行時的內存佈局,或者該字段在源代碼中出現的順序,還是別的?你能否舉一個你爲什麼想知道這個的例子(重新排列不是很清楚)。 – TofuBeer 2009-12-15 22:12:26

回答

0

我不完全確定你是什麼意思的類的「數據結構」,但假設你指的是它包含的成員,你要找的是反射。

嘗試this tutorial

+0

使用例如類內的二叉樹... – peterJk 2009-12-15 21:31:17

+0

我仍然不明白你的意思是使用單詞「數據結構」的類。它是成員名單嗎?與他們的類型?他們的價值觀如何?或者是其他東西? – CPerkins 2009-12-15 21:37:20

0

也許你錯過了一點:如果你構建一個封裝某種內部數據的類,那麼你不應該添加一個返回內部數據結構的方法,而只會返回封裝的數據。

(這是一種封裝的想法)

不應該有任何需要從外到「重新安排」的內部表示 - 因爲它被認爲是內部的,因此在其使用透明。 (這意味着:你甚至不應該能夠說出使用什麼樣的數據結構)

0

如果將它序列化,任何對象(即可序列化的)都將愉快地將其內部結構打印到二進制流。是的,這打破封裝。

是的,沒有人阻止你去改變二進制輸出,並再次讀取它來創建一個改變的對象。

 

注意:有關於序列化更奇怪的問題。例如,當反序列化對象時,不會調用構造函數而創建新對象。等等。對象的序列化可能是對象可以做的最不面向對象的事情。

0

你在這裏混淆了一些概念。

類真的是「數據結構+方法」,所以一般來說,你需要一個類來表示你的類。嘿,一個很好的定製構件會是你的數據已經存在的類。你可能會想到一個類作爲簡單字段的集合,但事實並非總是如此。

正如其他人所提到的,您可以通過反射來提取數據,例如,

public Map<String,Object> fields() { 
    Map output=new hashMap<String,Object>(); 
    for (Field f:getClass().getFields()) 
    { 
     try{ 
      output.put(f.getName(), f.get(this)); 
     } 
     catch(... //IllegalArgument, IllegalAccess.. {... } 
    } 
    return output; 
} 

您可以進入封裝的問題在這裏,一般類應該提供你需要從它看到的數據,我傾向於使用像這樣的事情僅用於調試。

我不確定你的意思是「重新排列結構」。該類通常表示數據的結構。如果你想完成一個轉換,它可能屬於一個類方法,例如你是否正在想像一個協調類的東西,它可以爲極座標提供一個轉換後的版本?

0

查看對象內部表示的一種簡單方法是使用XStream將其序列化。這將生成類及其組件的XML表示(等等)。

這是否打破封裝?是的 - 就是說你可以檢查班級的內部結構。您可以採用該XML,對其進行更改,並提供它與它所來自的.class結構匹配,然後將其反序列化爲一個.class實例。

相關問題