Прежде всего я, вероятно, должен сказать, что термин «постоянный объект», вероятно, не совсем прав и может уже означать нечто совершенно отличное от того, о чем я думаю, но это лучший термин, который я могу придумать, чтобы описать то, что я говорю о.
Итак, в основном я проектирую приложение, и я столкнулся с чем-то, что, кажется, существует существующий шаблон проектирования, но я не знаю, что это такое или что искать, поэтому я собираюсь описать, что это такое это я пытаюсь сделать, и я ищу предложения о том, как наилучшим образом реализовать его.
Допустим, у вас есть класс:
public class MyClass {
private String name;
private String description;
private int value;
public MyClass(String name, String description, int value) {
this.name = name;
this.description = description;
this.value = value;
}
// And I guess some getters and setters here.
}
Теперь предположим, что вы заранее знаете, что когда-нибудь будет только 3 экземпляра этого класса, и данные также известны заранее (или, по крайней мере, будут прочитаны из файла во время выполнения, и точное имя файла будет известно заранее). По сути, я имею в виду, что данные не будут изменены во время выполнения (после того, как они были установлены).
Сначала я подумал, что должен где-то объявить некоторые статические константы, например,
public static final String INSTANCE_1_DATA_FILE = "path/to/instance1/file";
public static final String INSTANCE_2_DATA_FILE = "path/to/instance2/file";
public static final String INSTANCE_3_DATA_FILE = "path/to/instance3/file";
public static final MyClass INSTANCE_1 = new MyClass(getNameFromFile(INSTANCE_1_DATA_FILE), getDescriptionFromFile(INSTANCE_1_DATA_FILE), getValueFromFile(INSTANCE_1_DATA_FILE));
public static final MyClass INSTANCE_2 = new MyClass(getNameFromFile(INSTANCE_2_DATA_FILE), getDescriptionFromFile(INSTANCE_2_DATA_FILE), getValueFromFile(INSTANCE_2_DATA_FILE));
public static final MyClass INSTANCE_3 = new MyClass(getNameFromFile(INSTANCE_3_DATA_FILE), getDescriptionFromFile(INSTANCE_3_DATA_FILE), getValueFromFile(INSTANCE_3_DATA_FILE));
Obvisouly теперь, когда я хочу использовать один из 3 экземпляров, я могу просто обратиться непосредственно к константе.
Но я начал думать, что, возможно, есть более чистый способ справиться с этим, и следующее, о чем я подумал, это сделать что-то вроде:
public MyClassInstance1 extends MyClass {
private static final String FILE_NAME = "path/to/instance1/file";
public String getName() {
if (name == null) {
name = getNameFromFile(FILE_NAME);
}
return name;
}
// etc.
}
Теперь, когда я хочу использовать экземпляры MyClass, я могу просто использовать тот, который хочу, например,
private MyClass myInstance = new MyClassInstance2();
Или, возможно, еще лучше сделать их синглетонами и просто сделать:
private MyClass myInstance = MyClassInstance3.getInstance();
Но я не могу не думать, что это также не правильный способ справиться с этой ситуацией. Я обдумываю проблему? Должен ли я просто иметь где-нибудь инструкцию switch, например,
public class MyClass {
public enum Instance { ONE, TWO, THREE }
public static String getName(Instance instance) {
switch(instance) {
case ONE:
return getNameFromFile(INSTANCE_1_DATA_FILE);
break;
case TWO:
etc.
}
}
}
Может кто-нибудь сказать мне, как лучше всего это реализовать? Обратите внимание, что я написал пример кода на Java, потому что это мой самый сильный язык, но я, вероятно, буду реализовывать приложение на C ++, поэтому в данный момент я больше ищу независимые от языка шаблоны проектирования (или просто для того, чтобы кто-то сказал мне: перейдите к одному из простых решений, которые я уже упоминал).