2014-02-24 8 views
10

Я узнал, что внутренние классы должны использоваться, когда объект тесно связан с другим объектом. Таким образом, класс LinkedList может содержать внутренний класс Node, поскольку каждый узел существует только в LinkedList.Слишком много внутренних классов?

Я думаю о создании игры и рассматриваю возможность создания объекта Map с двойным массивом Tiles, где каждый Tile является внутренним классом.

Но тогда я думал, что действительно класс Map должен быть внутренним классом внутри класса Game.

Таким образом, мы имеем

class Game { 
    class Map { 
    Tile[][] grid; 
    class Tile { 
     ... 
    } 
    ... 
    } 
    class Unit { 
    ... 
    } 
    class Player { 
    ... 
    } 
    ... 
} 

Однако, это кажется чрезмерным, так как это приводит только один, массивный файл. Это проблема? Или я полностью недопонимаю смысл внутренних классов?

Каковы факторы, которые следует учитывать при выборе того, чтобы ваш новый класс был внутренним или внешним, и если выбор является внутренним, когда внутренний класс должен быть static?

+9

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

+0

id go with @RobertHarvey и иметь тот же опыт. – lordkain

+0

. Об этом будет много, но я обычно придерживаю свои внутренние классы до объектов, которые используются только в контексте содержащего класса. Если мне нужно это в другом месте, из какого-то другого контекста, он становится его собственным классом. –

ответ

6

Когда использовать внутренние классы - это такое же искусство, как и наука. В основном посмотрите, насколько большой ваш файл кода получает и насколько большой каждый класс, если. Если класс большой и сложный, он должен, вероятно, идти в своем собственном файле. Если она небольшая (например, реализация одной функции интерфейса прослушивателя) и неоправданно используется для повторного использования в другом месте, то она, вероятно, должна быть внутренним классом.

Фактически повторное использование, вероятно, является одним из наиболее важных критериев. Все, что может быть повторно использовано, должно быть повторно использовано и должно быть ограничено соответствующим образом, чтобы включить это.

Важным преимуществом внутренних классов является то, что они могут помочь в инкапсуляции, сохраняя внутреннюю реализацию вашего класса внутри. Если другим классам не нужно знать о ваших внутренних классах (или, в некоторых случаях, даже о том, что они существуют), то это отличная причина для их внутреннего.

+6

Я бы квалифицировал это как «если он маленький и вряд ли будет использоваться где-нибудь еще, кроме внутри класса, в котором он написан». –

+0

@RobertHarvey хорошая точка, спасибо –

-5

По моему мнению, внутренний класс просто бесполезен и ведет к плохому дизайну, используя доступ, который не должен предоставляться, делая код неясным. Просто забыли об этом.

(По моему мнению, конечно)

+2

Есть много ситуаций, в которых вы хотели бы, чтобы ваш код имел неявный доступ к методам и полям содержащихся объектов. Это более чем оправдывает знание того, как и когда использовать внутренние классы. –

+5

Это определенно не так. Внутренние классы могут быть очень хорошими * проектами, если они используются соответствующим образом. Фактически, они используются много раз в стандартных классах JDK. – arshajii

+2

На самом деле, хотя грубо сказано, есть справедливое количество правды, что вы говорите. Во-первых, внутренние классы грубо реализованы (например, нет реальной поддержки JVM) и, следовательно, имеют существенные ограничения и странности в отношении них. И они делают так часто, как не делают код менее понятным. –

1

Это не вопрос «слишком много», по крайней мере, пока вы не попали некоторые жесткие ограничения. Речь идет о том, что можно разумно сказать, что оно принадлежит внутри. Карта всегда будет иметь записи, которые могут быть внутренним классом. У игры не всегда будет карта, поэтому карта не должна быть внутренней для игры.

0

В примере игры, который вы пытаетесь реализовать, y. Карта и плитка могут быть соответствующей структурой данных, а не отдельными внутренними классами. Какие-либо конкретные требования к их использованию в качестве классов?

1

Вопрос, который я задал бы: «Является ли внутренний класс понятным для себя?» Имеет ли смысл тип Map, или Game.Map Значительная ценность?

Я бы Map имеет смысл сам по себе и поэтому должен быть внешним классом. Затем вы можете указать близкую связь игры и карты с использованием пространств имен.

+0

Я не уверен, что карта действительно имеет смысл сама по себе, так как поведение карты зависит от того, от какой игры она исходит. Chess.Board очень отличается от MonopolyBoard. – Ypnypn

+1

Но вы могли бы написать программу редактирования карт для своей игры, и в этом случае вам понадобится класс Map отдельно от класса Game. Классы Совета по шахматам и монополии обычно не отличаются, пожалуй, внутренними классами шахмат и монополий, но также находятся в пакетах com.example.game.chess и com.example.game.monopoly. –

+0

@Ypnypn Ни шахматы, ни монополия, скорее всего, не будут иметь смысла как класс. Они будут пространством имен с несколькими классами, такими как Chess.Game и Chess.Board. – ILMTitan

Смежные вопросы