Это действительно вопрос о Java, а не о c ++.
Идея состоит в том, что вы хотели бы иметь возможность добавлять встроенную диагностику, которую можно включать и выключать, устанавливая флаг. И вы хотели бы, чтобы стоимость была низкой и близкой или равной нулю, когда флаг отключен.
Несколько лет назад я реализовал класс, который я назвал "Отладчик" в C ++, который сделал это. Проект использует перечисления для имен флагов, чтобы вы могли иметь код, который читается, эффективен и безопасен для типов. Использование выглядит следующим образом.
enum DebugBits {
testCondition1,
testCondition2,
testCondition3
nTestConditions
}`
Debugger testDebug("testDebug", nTestConditions,
"condition1",
"condition2",
"condition3");
Critical::doStuff()
{
...
if (testDebug.on(testCondition2))
doSomethingSpecial();
...
}
Это было легко реализовано с помощью битов, индексированных значениями enum и встроенными методами. Он хорошо работает в большой системе реального времени и имеет почти нулевую стоимость, когда отладка отключена. Это ценный инструмент.
В любом случае, вернемся к вопросу. Сегодня я пытался сделать то же самое в Java по личным причинам, но, учитывая, что вы не можете создать подклассы перечислений, и все же было бы хорошо их использовать, не так просто сохранить декларацию и ее использование в Краткое описание кода.
Итак, вот реализация, которая работает и несколько эффективна. Вопросы,
- Может ли реализация быть более эффективной?
- В то же время можно ли четко использовать использование в коде?
Я подозреваю, что есть лучшие Java-кодеры, которые могут иметь лучшие идеи о том, как это сделать. Добавьте пакет вверху, и он должен скомпилироваться и запустить. Внизу есть еще один класс для демонстрации использования. Обратите внимание, что в этом есть еще много чего, но это основная часть, которая интересна. Ну ... для меня.
import java.util.BitSet;
import java.util.EnumSet;
import java.util.Vector;
public class Debugger {
private final EnumSet mEnumSet;
private final BitSet mBits;
private final Vector<String> mNames;
public Debugger(EnumSet es) {
mEnumSet = es;
mBits = new BitSet(es.size());
mNames = new Vector<>();
for (Object i : mEnumSet)
mNames.add(i.toString());
}
public void set(int bit) {
mBits.set(bit);
}
public void set(String bitName) {
int bit = mNames.indexOf(bitName);
if (bit >= 0)
mBits.set(bit);
}
public boolean on(int bit) {
return mBits.get(bit);
}
public boolean on(Object arg) {
if (arg.getClass() == Enum.class) {
int bit = ((Enum)arg).ordinal();
return mBits.get(bit);
}
return false;
}
public boolean on(String bitName) {
int bit = mNames.indexOf(bitName);
return bit >= 0 && mBits.get(bit);
}
}
class SampleUsage {
static class Debug extends Debugger {
enum Bits {
zero, one, two, three;
public static final EnumSet<Bits> bits = EnumSet.allOf(Bits.class);
}
public Debug() {
super(Bits.bits);
}
}
public static final Debug debug = new Debug();
public SampleUsage() {}
void doStuff() {
if (debug.on(Debug.Bits.three))
showDebugInfo();
if (debug.on("three"))
showDebugInfo();
}
private void showDebugInfo() {}
}