【问题标题】:How to instantiate automatically all inner classes如何自动实例化所有内部类
【发布时间】:2023-03-07 14:05:01
【问题描述】:
public class A{
      private String A1;
      private B b;
 public class B{
      private String B1;
      private C c;
      private D d;
  public class C{
      private String C1;
  }
  public class D{
       private String D1;
 }
}

我有以下类结构有时更多的内部类,当我用泛型类实例化时,只调用构造函数 A 并实例化对象 A,有没有办法为所有内部类实例化所有对象有各自的默认构造函数。

我正在使用的泛型类如下。

public class GenericClass<O> {

        private Class<O> clazz;

        public GenericClass(Class<O> clazz){
                this.clazz = clazz;
        }

        public O get() throws InstantiationException, IllegalAccessException{
                return (O) clazz.newInstance();
        }
}

当我只做clazzO.newInstance() 时,B 和 C 将指向 null。在不明确担心所有内部类实例化的情况下,我可以一次完成吗?!

UPDATE:我已经更新了课程代码, 这是我将通过 Jackson 获得的示例 XML。

<?xml version="1.0" encoding="UTF-8"?>
<A>
   <A1>Outer Class A</A1>
   <B>
      <B1>Class B</B1>
      <C>
         <C1>Class C</C1>
      </C>
      <D>
         <D1>Class D</D1>
      </D>
   </B>
</A>

【问题讨论】:

  • 您是否有特定原因要实例化所有内部类?
  • 是的,我正在尝试将它映射到 XML - 使用 Jackson,有时我不需要所有类对象,有时我需要所有对象。根据我的要求,我必须实例化所有必要的对象以形成外部类对象 A。我正在寻找一种方法以某种方式使用所有内部类的默认构造函数进行实例化,并计划 set 只需要内部成员,我不希望任何内部类对象指向 null。
  • @Ivonet 我会忽略它。
  • 对于所有投反对票的人,我想知道如果我实例化所有内部类对象会产生什么错误功能,我只是要求一种更简单的方法,我没有要求@GhostCat 建议什么,请问有没有办法一次性搞定!!请正确阅读问题。在投票赞成或反对之前。
  • 我认为这是典型的xy 问题情况。你可能会更好地给出一个小但“完整”的图片。因此,请向我们展示一些 xml,以及您的 pojo 类以及您打算在这里实现的目标。

标签: java scope inner-classes


【解决方案1】:

你在这里弄错了。您假设封闭一个类意味着外部类也拥有内部类的一个对象。但这不一定是真的。拥有内部类是关于作用域,而不是关于隐式拥有内部类的实例!

这样不行:

  • 除非类 A 包含类 B 或 C 的字段,否则在创建 A 的实例时不需要(或方法)创建类 B 或 C 的实例
  • 反之亦然:为了创建 B 的实例,您必须提供 A 的实例。当您想要创建 C 对象时,您必须 提供一个 A 和一个 B 对象。

无论你是直接使用new 还是使用反射和newInstance() 都没有关系! (当然:这在可维护性和运行时性能成本方面很重要 - 仅在绝对需要时才应使用反射)

鉴于评论:如果您希望初始化内部类的 字段,那么您必须明确地执行此操作。喜欢:

 public A() {
   myB = this.new B();
   myC = myB.new C();

【讨论】:

  • 抱歉不提了,是的,A类包含了内部类的字段。我在所有内部类中都有一个默认构造函数。
  • “不管你是直接使用new还是使用反射和newInstance()”——当然,除了newInstance是一个该类的指定(无参数)构造函数的运行时查找。它使用反射并且速度较慢。
  • 似乎不容易的方法!!,当我必须做很多这些的时候。我同意你的回答,我知道这是一种方式。我会等待一段时间。在此之前。
  • @MCEmperor 这在谈论反射时有点含蓄,但好吧,改写了我的答案。
  • @GhostCat 确实如此,但考虑到 OP 在该主题上相对较新,将其明确化总是好的。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2016-06-11
  • 2014-06-18
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多