【问题标题】:Instantiate objects from instance of object从对象实例实例化对象
【发布时间】:2015-01-05 08:39:21
【问题描述】:

我正在创建一个游戏,其中角色可以附加模块以提供额外的功能,例如,可能有一个“银行家”模块,它监听点击事件并打开银行菜单。用户可以通过扩展Module 类并使用ModuleFactory 注册实例来创建模块。当在构造函数中传递时,模块能够序列化自己并从序列化表单中加载自己(保存到 XML)。

我遇到的问题是,在加载模块时,我有每个模块的名称和实例,但我无法为每个模块创建一个新实例。

在每个返回模块实例的模块内部创建一个newInstance() 方法是否可以接受? 我知道可以为此使用反射,但大多数时候我发现反射比我从中获得的好处更麻烦。

【问题讨论】:

  • "...我有每个模块的名称和实例,但我不能为每个模块创建一个新实例。"你能再解释一下吗?
  • @Stefan 我将每个模块的实例存储在带有模块名称的映射中。由于每个角色都需要每个模块的单独实例,因此我需要为其创建更多实例。

标签: java reflection instantiation


【解决方案1】:

可以这样做,因为您说您已经知道每个Module 的名称(希望在某种列表中)。

Class<?> temp = Class.forName("ModuleName");
Object obj = temp.newInstance();

这实际上是反射。


最初我有这个,但我上面的代码更胜一筹,因为这将要求你有一个在每个Module 中创建一个新实例的方法。它有效,但它很混乱。把它想象成这样,一个创建自身克隆的对象,这很奇怪。

public static Module createInstance()
{
    return new ThisModule();
}

【讨论】:

    【解决方案2】:

    如果你想要一个新实例作为现有实例的副本,你可以使用 clone 方法, 否则创建一个为你创建实例的工厂方法,

    public static Module createInstance(){
       return new Module();
    }
    

    我不确定我是否完全理解你想要什么

    【讨论】:

      【解决方案3】:

      在每个模块中创建一个静态方法来实例化。这是静态工厂方法。有效的java书说通过静态工厂方法创建对象确实是个好习惯。

      我认为我们可以在对象上调用静态方法(虽然不是一个好习惯)。

      【讨论】:

        【解决方案4】:

        如果我理解正确,您希望扩展对象的行为并能够通过 XML 将其发送/序列化到客户端并返回(前端 后端通信)。

        我认为您正在寻找的东西类似于您的模块和子模块的装饰。也许您应该构建它们可相互装饰,例如 InputStream。

        类似这样的:

        MyBaseModule base = new MyBaseModule();
        BankerModule banker = new BankerModule(base);
        ExtendedBankerModuler extBanker = new ExtendedBankerModule(banker);
        

        也许调用 extBanker.toXML() 来获取 XML 以将其发送到前端。 您可以用装饰标签的标签包装每个模块...

        <serialized>
            <module>
                <type>ExtendedBankerModule</type>
                <description>extended banker module</description>
                <decorates>
                    <module>
                        <type>BankerModule</type>
                        <description>banker module</description>
                        <decorates>
                            <module>
                                <type>MyBaseModule</type>
                                <description>basic module</description>
                                <decorates></decorates>
                            </module>
                        </decorates>
                    </module>
                <decorates>
            </module>
        </serialized>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多