Java构造函数注入

时间:2015-06-13 15:13:17

标签: java constructor dependency-injection instantiation constructor-injection

假设我有一个类resources,它实例化我的所有OpenGL / Java游戏对象,然后我将这些通过构造函数传递给我的Scene类(需要它们),就像这样(简化示例)...... ..

public class Resources {

    Hero hero;
    Enemy enemy;
    MenuButtons mainMenuButtons;
    Background background;
    Scene mainMenu;

    public void createObjects(){

        hero = new Hero();
        enemy = new Enemy();
        mainMenuButtons = new MenuButtons();
        background = new Background();
        mainMenu = new Scene(hero, enemy, mainMenuButtons, background);
    }
}

显然,我的Scene的构造函数需要采用4个参数:

public class MainMenu implements Scene {

    hero Hero;
    enemy Enemy;
    mainMenuButtons MenuButtons;
    background Background;

    public MainMenu(Hero hero, Enemy enemy, MainMenuButtons mainMenuButtons, Background background){

        this.hero = hero;
        this.enemy = enemy;
        this.mainMenuButtons = mainMenuButtons;
        this.background = background;
    }
}

随着需要更多对象,构造函数变得越来越长。现在让我们说我做了类似下面的事情:

public class MainMenu implements Scene {

    Resources resources;

    public MainMenu(Resources resources){

        this.hero = resources.hero;
        this.enemy = resources.enemy;
        this.mainMenuButtons = resources.mainMenuButtons;
        this.background = resources.background;
    }

}

这两个选项都允许我在mainMenuScene中使用对象,如下所示:

hero.move();

第二个似乎有点整洁,因为构造函数永远不需要采取任何额外的参数。 然而据我所知,我从来没有见过这样的例子。这是一种有效的技术吗?我会遇到使用它的问题吗?

2 个答案:

答案 0 :(得分:2)

简答: - 是的,该技术是有效的,它应该可以正常工作。
更长的部分: -
我想建议两种设计方法来考虑

essence模式

fluent界面模式

这两者的意图相似。

此外,构建器模式也很有用。我们多次使用hibernate看到它。对于你的课程,它可能如下: -

static

然后你可以使用下面的链接来创建对象: -

public class mainMenu implements Scene {

    private Hero hero;
    private Enemy enemy;
    private MenuButtons mainMenuButtons;
    private Background background;

    public mainMenu setHero(Hero hero){this.hero = hero; return this}
    public mainMenu setEnemy(Enemy enemy){this.enemy = enemy; return this}
    public mainMenu setMainMenuButtons(MenuButtons mainMenuButtons){this.mainMenuButtons = mainMenuButtons; return this}
    public mainMenu setBackground(Background background){this.background = background; return this}


}

P.S。即使你不想使用上述模式,我也建议三种变化或习惯 1.班级名称以大写字母和
开头 2.按字母顺序组织论点的惯例 3.您可能希望将成员的访问级别设置为私有。

答案 1 :(得分:1)

我喜欢它。而不是Resources,我喜欢将其称为ApplicationContext并使用相同的方式。

我因创建"God Object"而受到批评。我不同意这一点。只要ApplicationContext很薄并且只保存对象,但对它们一无所知(调用任何方法),那就没关系。它可以被List或Map替换,除了我喜欢附加的类型检查。

请参阅Service Locator模式以了解其他方法。