Я работаю над кодом, связанным с оборудованием и математикой, и широко использует беззнаковые целочисленные значения, 32- и 64-разрядные. Ошибки были устойчивыми и трудными для работы без поддержки javac. Java 8 добавила несколько функций в бокс-классе Long для деления, мод и сравнений, но пока они обеспечивают поддержку во время выполнения, отсутствие предупреждений о компиляции для непреднамеренного смешивания этих двух заставил меня хотеть вытащить мои волосы ,Идеи для решения целых чисел без знака в Java 8
Кто-нибудь знает какие-либо способы помочь решить эти проблемы? Один из членов команды Java упоминает possible annotation support для проверки типа.
До сих пор я префикс всех неподписанные переменных u_, и я даже пытался добавив /* unsigned */
комментарий перед каждым из int
вхождения или long
, которые должны быть подписаны. Хотя они были полезны, они также были чрезвычайно захламлены. Это не слишком далеко. Есть слишком много возможностей для ошибок.
Две из больших проблем - это нежелательное расширение знака и смешанные операции.
Нечто безобидное, как /* unsigned */ long u_lowmask = 0xffffffff
, не имеет желаемого результата или даже просто /* unsigned */ long u_widen64 = small32
разрушает вещи с помощью этого бесшумного расширения. На других языках я могу получить предупреждения от компилятора или Lint-like static checker. Функциональные языки часто встраивают его в механизм проверки типов, но Java избегает их в пользу других решений. Есть очень много шансов на смешанное сравнение или операции.
Любые идеи, возможно, не имеют никакого воздействия во время работы, поэтому я не могу позволить себе обернуть без знака в классе или бонусах. Ну, я мог бы обернуть их в класс, если мне удастся это сделать без какого-либо выделения или затрат на локаторы потоков, но это, вероятно, сделает код невозвратным. Также Hotspot должен был бы иметь возможность испускать код для завернутых целых чисел без знака, близких к простым native. (На самом деле, я думаю, что Hotspot, вероятно, достаточно умный, чтобы приблизиться - возможно, дополнительная память читает и пишет.)
Как другие люди кодируют эту проблему?
переписан, чтобы удалить ссылку на библиотеку или инструментов. – JasonN
Я думаю, что решение, основанное на аннотации, было бы самым чистым, но afaik не будет подходящего инструмента проверки. – Holger