Java构造函数注入

Java构造函数注入,java,constructor,dependency-injection,instantiation,constructor-injection,Java,Constructor,Dependency Injection,Instantiation,Constructor Injection,假设我有一个类resources,它实例化了我所有的OpenGL/Java游戏对象,然后我通过构造函数将这些对象传递给我的场景类(需要它们),就像这样(简化示例) 显然,我的场景的构造函数需要采用4个参数,如下所示: public class MainMenu implements Scene { hero Hero; enemy Enemy; mainMenuButtons MenuButtons; background Background; pu

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

显然,我的场景的构造函数需要采用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();
第二个似乎有点整洁,因为构造函数永远不需要接受任何额外的参数。然而,就我所能回忆起的,我从来没有见过这样的例子。这是一种有效的技术吗?我在使用它时会遇到问题吗?

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

模式

界面模式

这两者的意图相似

此外,生成器模式也很有用。我们使用hibernate多次看到它。对于您的班级,它可能如下所示:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
然后,您可以使用如下所示的链接创建对象:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
另外,即使你不想使用上述模式,我建议你改变三种习惯。
1.类名以大写字母和
2.按字母顺序组织论点的惯例。
3.您可能希望将成员的访问级别设置为private。

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

模式

界面模式

这两者的意图相似

此外,生成器模式也很有用。我们使用hibernate多次看到它。对于您的班级,它可能如下所示:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
然后,您可以使用如下所示的链接创建对象:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
另外,即使你不想使用上述模式,我建议你改变三种习惯。
1.类名以大写字母和
2.按字母顺序组织论点的惯例。
3.您可能希望将成员的访问级别设置为private。

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

模式

界面模式

这两者的意图相似

此外,生成器模式也很有用。我们使用hibernate多次看到它。对于您的班级,它可能如下所示:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
然后,您可以使用如下所示的链接创建对象:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
另外,即使你不想使用上述模式,我建议你改变三种习惯。
1.类名以大写字母和
2.按字母顺序组织论点的惯例。
3.您可能希望将成员的访问级别设置为private。

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

模式

界面模式

这两者的意图相似

此外,生成器模式也很有用。我们使用hibernate多次看到它。对于您的班级,它可能如下所示:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
然后,您可以使用如下所示的链接创建对象:-

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}


}
mainMenu main =new mainMenu().
setHero(new Hero()).
setEnemy(new Enemy()).
setMainMenuButtons(new MainMenuButtons()).
setBackground(new Background());
另外,即使你不想使用上述模式,我建议你改变三种习惯。
1.类名以大写字母和
2.按字母顺序组织论点的惯例。

3.可能您想将成员的访问级别设置为private。

我喜欢。与
Resources
不同,我喜欢将其称为
ApplicationContext
,并使用相同的方法

我因为创造了一个新的世界而受到批评。我不同意这一点。只要ApplicationContext是精简的,并且只保存对象,但对它们一无所知(调用任何方法),那么就可以了。它可以被列表或地图所取代,除非我喜欢额外的类型检查


查看模式以了解另一种方法。

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

我因为创造了一个新的世界而受到批评。我不同意这一点。只要ApplicationContext是精简的,并且只保存对象,但对它们一无所知(调用任何方法),那么就可以了。它可以被列表或地图所取代,除非我喜欢额外的类型检查


查看模式以了解另一种方法。

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

我因为创造了一个新的世界而受到批评。我不同意这一点。只要ApplicationContext是精简的,并且只保存对象,但对它们一无所知(调用任何方法),那么就可以了。它可以被列表或地图所取代,除非我喜欢额外的类型检查


查看模式以了解另一种方法。

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

我因为创造了一个新的世界而受到批评。我不同意这一点。只要ApplicationContext是精简的,并且只保存对象,但对它们一无所知(调用任何方法),那么就可以了。它可以被列表或地图所取代,除非我喜欢额外的类型检查


另一种方法见模式。

@huseyintugrulbuyukisik,我可能理解错误,但我认为Java是按值传递的,对象的值(与原语相反),是指向对象的指针,而不是对象本身?如果是这样,通过一个对象怎么可能比通过3个对象更糟糕?显然,我在这方面的理解是错误的-谢谢!你是正确的,你只会得到一份参考资料