2016-06-09 1 views
0

При создании программного обеспечения я часто обнаруживаю, что мне нужно предоставлять экземпляры вокруг много, чтобы они могли ссылаться на нестатические элементы друг друга. Вместо огибает большое число объектов, я мог бы создать класс (в Java), как следующее:Есть ли недостатки в использовании этой системы?

public class Handler { 

    private HashMap<String, Object> map = new HashMap<>(); 

    public void put(String key, Object value) { 
     map.put(key, value); 
    } 

    public Object get(String key, Object value) { 
     return map.get(key); 
    } 
} 

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

Я чувствую, что использование вышеизложенного будет довольно плохо делать на уровне разработки программного обеспечения. Есть ли что-то «неправильное» в этом?

+2

Основная проблема заключается в том, что вы теряете информацию о типе: вы не знаете, имеет ли данный экземпляр «Handler» данный ключ, и вы не знаете, связано ли значение, связанное с ключом данного тип. –

+0

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

+0

Это может быть ассимилировано по шаблону реестра. –

ответ

2

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

Если вам нужно обмениваться товарами, подумайте о наличии репозитория, каждый тип объекта. Затем вы можете запросить этот репозиторий для элементов, и вы сможете их модифицировать по мере необходимости.

Имейте в виду, что это может вызвать проблемы с параллелизмом, поэтому соответствующим образом создайте свои репозитории.

1

Основная проблема заключается в том, что вы теряете информацию о типе: вы не знаете, имеет ли данный экземпляр Handler данный ключ, и вы не знаете, связано ли значение, связанное с ключом данного типа ,

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

Вы лучше определения пользовательского класса для каждой цели, с семантический-значимыми областями:

class Specific { 
    private String name; 
    private int age; 
    private List<String> friends; 

    // Define getters etc. 
} 

Получит ваш IDE сгенерировать шаблонный код для вас. Или посмотрите на что-то вроде Google's AutoValue, которое генерирует классы для вас во время компиляции.

0

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

+0

Проблема параллелизма - это не проблема дизайна, а проблема реализации. Вы можете использовать ConcurrentHashMap. –

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