复制类的内部数据结构

时间:2009-12-15 21:20:33

标签: java

出于好奇,我想知道Java中是否存在任何类,其中的方法返回其数据结构的副本。我问,因为在课堂上老师说这样的方法破坏了隐私,但我认为如果你想重新安排结构,获得结构的副本是有用的。我想举个例子。感谢。

5 个答案:

答案 0 :(得分:0)

我不完全确定你所说的“数据结构”是什么意思,但假设你指的是它所包含的成员,你所寻找的就是反思。

尝试this tutorial

答案 1 :(得分:0)

也许你错过了这一点:如果你构建了一个封装了某种内部数据的类,那么你就不应该添加一个返回内部数据结构的方法,而只是添加封装的数据。

(这是封装的想法)

不应该需要从外部“重新安排”你的内部表示 - 因为它应该是内部的,因此在使用时是透明的。 (意思是:你甚至不能说出使用了什么样的数据结构)

答案 2 :(得分:0)

如果序列化它,任何对象(可序列化的)都会很乐意将其内部结构打印到二进制流中。是的,这打破了封装。

是的,没有人阻止您更改二进制输出并再次读取它以创建更改的对象。

注意:有关序列化的更多奇怪问题。例如,在反序列化对象时,会创建新对象,而不会调用其构造函数。等等。对象的序列化可能是最不能面向对象的对象。

答案 3 :(得分: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;
}

你可以在这里讨论封装问题,一般来说,类应该提供你需要从中看到的数据,我倾向于使用这样的东西来进行调试。

我不确定你的意思是“重新安排结构”。该类通常表示数据的结构。如果您想要完成转换,它可能属于类方法,例如你是否正在考虑一种类似于坐标类的东西,它可以将自身的转换版本提供给极坐标?

答案 4 :(得分:0)

查看对象内部表示的一种简单方法是使用XStream对其进行序列化。这将生成类及其组件的XML表示形式(等等)。

这会破坏封装吗?是的 - 从某种意义上说,你能够检查班级的内部结构。您可以获取XML,更改它,并提供它与它来自的.class结构相匹配,将其反序列化为.class实例。