2012-04-27 2 views
3

Сценарий:long primitive NaN value

1) У меня есть длинная переменная состояния, которая может быть установлена ​​или не установлена.

2) Эта длинные переменные имеют действительные значения от Long.MIN_VALUE до Long.MAX_VALUE включая нулевую

3) Это производительность чувствительный код, так что я не хочу использовать длинный тип-оболочку

Как я пишу 'установленный' тип проверки для этого долго? Должен ли я добавить второе логическое значение для проверки того, является ли long действительным или нет? Это кажется неряшливым. Я знаю, что могу использовать длинную оболочку здесь, но это похоже на отход производительности, который создает столько объектов и проверяет значение null.

псевдокода (это вроде того, что я хочу):

class foo { 

long someLong = NaN; //NaN = hypothetical not a number like Double 

public reset() { 
    someLong = NaN; 
} 

public doSomethingElse() { 
    if(someLong !=NaN) { 
    //report 
    reset(); 
    } 
} 

public doSomeStuff() { 
    if(someLong == NaN) { 
    someLong = //something 
    } 
} 

} 

} 
+1

Любые причины, по которым вы не хотите использовать Boolean для чего-либо, установленного или не настроенного? – JAM

+2

Просто используйте дополнительные булевы для set/not set. – Ryan

+0

Хорошо, круто. Спасибо за перепись. Логическое здесь похоже на правильное решение. Я просто думаю, что это не самый читаемый и вне конвенции, который вы видите для других типов (например, Object: null, double: NaN), но производительность гарантирует это в этом случае. –

ответ

3

Вам нужно будет выделить специальное значение для NaN. Если вы действительно используете все возможные значения, их нет.

Вы уверены, что длинные объекты - это большая проблема производительности?

Если да, возможно, имеется дополнительное логическое значение, чтобы обозначить, установлено ли значение или нет?

+0

«Длинный» имеет косвенную + распределение/стоимость GC, поле «значение» является окончательным, а на не-x86 для него требуется дополнительный заказный забор. – bestsss

1

Там нет NaN долго. Если вы уверены, что производительность имеет решающее значение (я бы испытал ограничение скорости при использовании Long), тогда вы захотите использовать другое значение флага.

1

Я использовал Long.MIN_VALUE как его нечетные свойства, как

Long.MIN_VALUE == -Long.MIN_VALUE 

Его также реже встречаются в природе.

Проблема с его использованием, это может сделать код более сложным. По этой причине я использую double, а целые значения меньше +/- 2^53 могут быть представлены без ошибок.

2

Используйте длинный вместо длинного и используйте значение null как значение NaN.

Смежные вопросы