Требуется Карта .
Распространенной (вероятно, самой распространенной) реализацией Map является HashMap :
private static final Map<String, Map<Boolean, BufferedImage>> textures;
static {
String[] baseNames = {
"unknown",
"stone",
"grass",
"dirt",
"iron_ore",
"coal_ore",
"diamond_ore",
"bedrock",
"andesite",
"granite",
"marble",
};
Map<String, Map<Boolean, BufferedImage>> map = new HashMap<>();
for (String baseName : baseNames) {
BufferedImage regular =
renderer.loadImage(path + baseName + ".png");
BufferedImage dark = darken(regular);
Map<Boolean, BufferedImage> regularAndDark = new HashMap<>(2);
regularAndDark.put(false, regular);
regularAndDark.put(true, dark);
map.put(baseName, Collections.unmodifiableMap(regularAndDark));
}
textures = Collections.unmodifiableMap(map);
}
/** returns the textures of the name provided */
public static BufferedImage getTexture(String name, boolean darken) {
Map<Boolean, BufferedImage>> matches = textures.get(name);
assert matches != null : "No textures for name \"" + name + "\"";
return matches.get(darken);
}
Однако… Есть возможности для улучшения:
- Как видите, я добавил оператор
assert
, чтобы убедиться, что недопустимые строковые аргументы не предоставлены. Этого можно избежать, используя значение enum
в качестве ключа изображения вместо строки, что исключает возможность неправильных написаний. Map<Boolean, BufferedImage>>
немного сложнее для понимания. Я бы сделал простой внутренний класс для хранения обоих, поэтому структура более очевидна.
Имея это в виду, это выглядит так:
public enum TextureType {
UNKNOWN,
STONE,
GRASS,
DIRT,
IRON_ORE,
COAL_ORE,
DIAMOND_ORE,
BEDROCK,
ANDESITE,
GRANITE,
MARBLE,
}
private static class Textures {
final BufferedImage regular;
final BufferedImage dark;
Textures(BufferedImage regular) {
this.regular = Objects.requireNonNull(regular,
"Image cannot be null");
this.dark = darken(regular);
}
}
private static final Map<TextureType, Textures> textures;
static {
Map<TextureType, Textures> map = new EnumMap(TextureType.class);
for (TextureType type : TextureType.values()) {
map.put(type,
new Textures(renderer.loadImage(path + baseName + ".png")));
}
textures = Collections.unmodifiableMap(map);
}
/** returns the textures of the name provided */
public static BufferedImage getTexture(TextureType type, boolean darken) {
Objects.requireNonNull(type, "Texture type cannot be null");
Textures match = textures.get(type);
return darken ? match.dark : match.regular;
}