Реализации используют подсчет ссылок, чтобы определить, когда нужно удалить переменную.
После того, как переменная выходит за пределы области видимости (как в вашем примере), если на ней нет других ссылок, тогда память будет освобождена.
def a():
x = 5 # x is within scope while the function is being executed
print x
a()
# x is now out of scope, has no references and can now be deleted
Кроме клавиш словаря и элементы в списках, как правило, очень мало причин вручную удалять переменные в Python.
Хотя, как сказано в ответах на , этот вопрос , использование del может быть полезно, чтобы показать намерение .
Используйте метод valueOf
, который автоматически создается для каждого Enum.
Verbosity.valueOf("BRIEF") == Verbosity.BRIEF
Для произвольных значений начинайте с:
public static Verbosity findByAbbr(String abbr){
for(Verbosity v : values()){
if( v.abbr().equals(abbr)){
return v;
}
}
return null;
}
Переходите к реализации карты позже, только если ваш профилировщик говорит вам об этом.
Я знаю, что он выполняет итерацию по всем значениям, но только с тремя значениями перечисления вряд ли стоит каких-либо других усилий, на самом деле, если у вас нет большого количества значения, я бы не стал возиться с картой, это будет достаточно быстро.
И вы не можете использовать valueOf () ?
Изменить: Кстати, ничто не мешает вам использовать static {} в перечислении.
Вы близко. Для произвольных значений попробуйте что-то вроде следующего:
public enum Day {
MONDAY("M"), TUESDAY("T"), WEDNESDAY("W"),
THURSDAY("R"), FRIDAY("F"), SATURDAY("Sa"), SUNDAY("Su"), ;
private final String abbreviation;
// Reverse-lookup map for getting a day from an abbreviation
private static final Map<String, Day> lookup = new HashMap<String, Day>();
static {
for (Day d : Day.values()) {
lookup.put(d.getAbbreviation(), d);
}
}
private Day(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getAbbreviation() {
return abbreviation;
}
public static Day get(String abbreviation) {
return lookup.get(abbreviation);
}
}