出於好奇,我想知道Java中是否存在任何類,並使用返回其數據結構副本的方法。我問,因爲在課堂上,老師說這樣的方法打破了隱私,但是我認爲如果你想重新安排結構,那麼獲得結構的副本是有用的。我想要一個例子。謝謝。一個類的內部數據結構的副本
0
A
回答
0
我不完全確定你是什麼意思的類的「數據結構」,但假設你指的是它包含的成員,你要找的是反射。
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實例。
相關問題
- 1. 創建一個AVPacket結構的副本
- 2. 類內部的結構
- 3. 類內部結構
- 4. 找出哪個是python熊貓數據結構中的副本
- 5. Python中的opencv2 ORB數據結構的深層副本
- 6. 結構內結構,能夠改變內部結構類型
- 7. JDK用於類TreeMap的內部數據結構
- 8. 具有更多數據類型內部結構的單鏈表
- 9. Java中的嵌套數據結構(內部類)
- 10. 怎麼看另一個結構內部結構的價值
- 11. 當使用一個類內部的結構,值爲零
- 12. 如何確定另一個結構內部的結構數組的長度
- 13. 結構副本問題
- 14. 創建一個結果行的副本
- 15. 內部方法和數據結構。
- 16. 數據庫引擎內部結構
- 17. Perl 6有一個內置工具來製作嵌套數據結構的深層副本嗎?
- 18. 從數據構建一個類似於表格的結構
- 19. 最快的方法來創建一個結構數組的只讀副本?
- 20. 數據結構的類型
- 21. 類的數據結構
- 22. C指針結構的深層副本
- 23. C中的文件夾結構副本#
- 24. 如何獲得一個結構部件上指針的結構體內部
- 25. 維護數據庫的類似副本
- 26. 將char指定給一個struct中的char數組,這些結構在一個結構數組內部的結構數組裏面,這個結構數組裏面有一個結構數組,裏面有一個結構數組,裏面有一個struct array
- 27. 結構返回和主內部另一個函數的比較
- 28. 聲明一個函數內部創建的全局結構
- 29. 如何在數據具有層次結構時創建數據的副本
- 30. C:製作一個結構體的深層副本...製作一個結構體的淺拷貝
你能否進一步解釋什麼是結構的「複製」?你有一個簡單的例子嗎? – OscarRyz 2009-12-15 21:24:42
您的意思是運行時的內存佈局,或者該字段在源代碼中出現的順序,還是別的?你能否舉一個你爲什麼想知道這個的例子(重新排列不是很清楚)。 – TofuBeer 2009-12-15 22:12:26