0

Предположим, у меня есть класс resources, который запускает все мои объекты игры OpenGL/Java, а затем передаю их через конструктор в класс Scene (который их требует), например (упрощенный пример) .... .Встраивание Java Constructor

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); 
    } 
} 

Очевидно конструктор моей Сцены должны были бы взять 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

@huseyintugrulbuyukisik, может быть, я неправильно понимаю, но я, хотя Java был pass-by-value, значение для объектов (в отличие от примитивов), являющееся указателем на объект, а не сам объект? Если да, то как передать один объект хуже, чем прохождение 3? Очевидно, мое понимание в этой области неверно - спасибо! – Zippy

+1

Вы правы Zippy, вы получите только копию ссылки, а не копию всего объекта. – folkol

+0

С помощью [Guice] (https://github.com/google/guice/wiki/GettingStarted) то, что вы описываете, называется 'Module'. – dimo414

ответ

2

Ответ: - Да, эта методика действительна, и она должна работать нормально.
Longer часть: -
Я хотел бы предложить два проектных подходов рассмотреть

The essence рисунка на

Узор fluent интерфейс

Они оба похожи намерения.

Также может быть полезен шаблон строителя. Мы видим это много раз, используя спящий режим. Для своего класса это может нравится ниже: -

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()); 

P.S. Даже если вы не хотите использовать вышеуказанные шаблоны, я рекомендую три изменения или привычки.
1. Название класса начинается с прописного алфавита и
2. Соглашение об упорядочивании аргументов в алфавитном порядке.
3. Возможно, вы хотите установить уровень доступа участников к частному.

+1

Я могу добавить к вашим двум моментам, что вы больше всего подходите, чтобы установить уровень доступа членов к частному. – Emz

+0

@ Емз получил вас .. Спасибо .. Я сделал их частными .. Мои плохие скопировали членов, как и из вопросов –

+0

Спасибо @VirajNalawade за пример кода и ссылки, они очень полезны. Быстрый вопрос о шаблоне строителя. Могу ли я использовать его, если объект, который я создаю, должен быть доступен в нескольких сценах? Я имею в виду тот же объект, а не его новую копию. Если бы не было другого подхода в моей ситуации лучше? Спасибо – Zippy

1

Мне это нравится. Вместо Resources я хотел бы назвать это ApplicationContext и использовать тот же путь.

Я был оценен для создания "God Object". Я не согласен с этим. Пока ApplicationContext тонкий и содержит только объекты, но ничего не знает о них (вызывать любые методы), тогда все в порядке. Он может быть заменен списком или картой, за исключением того, что мне нравится дополнительная проверка типов.

См. Рисунок Service Locator для другого способа сделать это.

+0

Если вы убедитесь, что так называемый объект Бога не имеет доступа к каким-либо его свойствам, то я думаю, это прекрасно. Это немного опасно, если один объект может хранить все данные. Может быть, решение Singleton для конкретных данных может быть жизнеспособным? Как база данных стажера? – Emz

+0

Абсолютно @marcspace, он просто создает объекты. На самом деле на самом деле для них нет никакой логики, все это внутри самих объектов. В настоящее время он содержит некоторые аксессоры, но их можно удалить (они больше не потребуются, так как я получаю доступ к объектам напрямую с помощью этого метода), спасибо за предложения тоже Emz. – Zippy