Проект управления ресурсами - PullRequest
0 голосов
/ 21 февраля 2012

Я делаю игру в Java, и я застрял с проблемой дизайна. Мои ресурсы (изображения, анимация, звуки) хранятся в нескольких HashMaps, по одному для каждого типа ресурса. Эти (статические) хеш-карты расположены в статическом классе, называемом «Res». Когда объект нуждается в ресурсе, он обращается к одной из хэш-карт глобального класса, и если ресурс не существует, он автоматически загружается.

    static Map<String, Sprite> sprites = new HashMap<>();
static Map<String, BufferedImage> images = new HashMap<>();
static Map<String, Clip> sounds = new HashMap<>();
static Map<String, Font> fonts = new HashMap<>();

Мой вопрос: достаточно ли хорош этот дизайн? Я читал, что статические функции - плохая практика, но нужно ли тогда каждый раз передавать экземпляр класса Res? Или есть другие альтернативы? А также, является ли эта система управления ресурсами хорошей практикой? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Будьте проще. Пока вам не нужны несколько разных экземпляров вашего «кеша ресурсов», использовать статическую ссылку можно.

Если вас беспокоит необходимость передавать слишком много ссылок на все виды объектов в вызовах ваших методов, вы можете собрать ссылки на все ваши объекты в «контекстном» объекте и передавать их только вокруг.

0 голосов
/ 21 февраля 2012

Используйте Singleton для поддержки всех ресурсов вместо этих статических функций.

public class ResourceSingleton {
    private Map<String, Sprite> sprites = new HashMap<>();
    private Map<String, BufferedImage> images = new HashMap<>();
    private <String, Clip> sounds = new HashMap<>();
    private <String, Font> fonts = new HashMap<>();     

    public Map getSprites()
    {return sprites;}

    public void setSprites(Map<String,Sprite> sprites)
    { this.sprites = sprites; } 

    //generate other getter setter

    // Private constructor prevents instantiation from other classes
    private ResourceSingleton() { }


    private static class SingletonHolder { 
            public static final Singleton instance = new Singleton();
            //populate your resource here.
    }

    public static ResourceSingleton getInstance() {
            return SingletonHolder.instance;
    }

}

Для использования ресурса вы можете просто позвонить

ResourceSingleton res = ResourceSingleton.getInstance();
Sprite firstSprite = res.getSprites().get("firstSprite");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...