2014-12-09 1 views
4

Я вижу этот кусок кода почти в каждом игровом примере для Java. Создайте экземпляр класса Game, затем выполните цикл из этого экземпляра.Как создать игру

public static void main(String[] args) { 
    Game g = new Game(); 
    g.gameLoop(); 
} 

public Game() { 
} 

Однако, как я ничего не делать, кроме выполнения gameLoop() почему бы не написать это так? Я не действительно нужно сохранить экземпляр Game где угодно? Как это.

public static void main(String[] args) { 
    new Game(); 
} 

public Game() { 
    gameLoop(); 
} 

Если да, то для чего?

Оба случая работают и прошли проверку мной.

+12

Конструктор используется для создания допустимого экземпляра класса и ничего другого. Написание 'gameLoop();' в конструкторе может работать, но это очень плохой код. – Tom

+0

@Tom Я полагаю, что это тот ответ, который я ищу. – Emz

+2

Вы можете просто создать новую игру(). GameLoop(); '. Это не нарушит никаких соглашений ООП. –

ответ

3

если вы пишете так:

new Game(); 

Это делается с помощью конструктора. Основная цель конструктора - создавать объекты и инициализировать любые переменные и устанавливать любое начальное значение, которое необходимо установить.

Если вы пишете только new Game(), он может скомпилировать, но это не значит, что это хороший способ реализовать. Почему это не хорошая реализация?

Это потому, что вы так же хороши, как писать свой entire game внутри конструктора. Начнем с того, что на самом деле вы не должны реализовывать всю свою логику в конструкторе.

Так почему люди делают это так:

Game g = new Game(); 
g.gameLoop(); 

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

  • Легче управлять коды
  • Легче отлаживать коды, короче время отладки
  • написать один раз, использовать его n раз
  • легче читать и поддерживать свои коды

Однако существуют разные способы кодирования Java. Также можно сделать gameLoop()статическим. Так что вы можете сделать это (без создания экземпляра объекта):

Game.gameLoop(); 

Это возможно, но я не советую этого делать.

+0

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

0

Одна из причин связана с философией: конструкторы предназначены для построения вещей, а не для их запуска. Но есть и практическая проблема. Если вы вызываете gameLoop() внутри конструктора, то у вас нет способа создать Game без его запуска. Это может создать проблему, если, скажем, вы захотите построить игру, затем внесите некоторые изменения в ее конфигурацию, а затем запустите ее.Этот сценарий будет иметь еще больший смысл, если вы закончите подклассификацию Game.