2011-02-01 2 views
5

В Java нет глобального доступа, как в C++. Итак, что бы вы сделали, если бы хотели создать контейнер объектов, к которым можно получить доступ из любого класса? Или сказать java bean, который содержит глобальные значения.Глобальный доступ в Java

Например, если я создаю симулятор лифта, поля, которые должны быть известны всем, как int numElevators, должны быть где-то в порядке? То же самое с объектом сбора для лифтов Elevators[] elevators.

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

+4

Обычно довольно элегантное решение не использовать глобалам или эквивалентные вещи;) – delnan

+1

Предположительно лифты в здании? Класс здания имел бы смысл. – diagonalbatman

ответ

4

Я бы ожидал, что экземпляр Building будет иметь коллекцию Elevators. Я думаю, что в проекте действительно очень мало, и вы обычно можете найти какой-то управляющий объект, который должен содержать и распространять эти знания.

Посредством привязки к этому объекту вы можете: a) легко управлять доступом и сменой/рефакторированием; b) высмеять это и упростить тестирование.

+0

Это абсолютно правильный путь.В 99% случаев вещь, которую вы хотели использовать Singleton для, может быть связана с объектом. Более сложный пример - это что-то вроде количества шагов, на которые вы хотите запустить симуляцию, но это можно решить, имея объект «Симуляция». – DJClayworth

+0

Мне нравится идея управляющей организации, и она также распространяет знания. Таким образом, хороший дизайн должен быть одноэлементным классом, который содержит лифты, и класс диспетчера лифта, который имеет ссылку на этот объект с одноэлементным выпуском? – Steve

+0

Я бы ожидал экземпляр ElevatorManager * *, и сделать это доступным только для классов, которые должны знать об этом. Если это кажется огромным числом, то это часто указатель на то, что ваше моделирование не совсем правильно. –

0

Вы можете создать класс с кучей открытых статических полей. Что-то вроде

class AppGlobals { 
    public static final String IMPORTANT_STUFF = "something global..."; 
    .... 

} 

Или вы можете прочитать в конфигурации свойств, чтобы получить простые данные, такие как строки и многое другое.

Вы можете также объединить 1 и 2.

Edit - для лифта/например, здания, хороший дизайн OO устранит необходимость глобалов ....

1

Я могу думать об одном способ создания одиночного класса для хранения всех этих глобальных переменных. Затем используйте статические методы для обеспечения доступа из любого класса. Но есть ли более элегантное решение?

Нет, это способ сделать это. Сочетание статических методов и синглетонов.

+0

У меня есть класс Singleton Building, но всегда вызываю Building.getElevators() кажутся неэлегантными. – Steve

+0

почему? Когда вы думаете об этом, вы получаете лифты для здания, с которым работаете. Имя является описательным. –

1

Вы можете создать не-singleton-класс с нужными полями и предоставить экземпляр этого для всего, что ему нужно.

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

Например, вы можете начать с одного набора лифтов, но позже захотите несколько комплектов для разных башен или зданий.

0

Возможно, вы захотите ознакомиться с парадигмой дизайна Monostate, если вы уклоняетесь от Singleton. Вот хороший вопрос StackOverflow.

Monostate vs. Singleton