Valhalla؛ نمایش ticker در یک int با value class

چرا مهم است

اگر با ticker کار می‌کنی، این نمونه نشان می‌دهد چطور نمایش در یک int می‌تواند ترتیب مقایسهٔ رشته‌ها را هم حفظ کند. همچنین می‌بینی کدام عملیات بدون ساخت String انجام می‌شوند و چرا حذف allocation به شرایط اجرای JVM وابسته است.

قبل از خواندن، این‌ها را بدان۴ مفهوم
value class

نوعی class بدون identity که نمونه‌هایش بر اساس مقدارشان تعریف می‌شوند، نه هویت مستقل هر شیء.

در حال نگارش: value class

padding

مقدارهایی که برای پر کردن فضای استفاده‌نشدهٔ یک نمایش داده اضافه می‌شوند؛ در این نمونه، صفر جایگاه‌های خالی را مشخص می‌کند.

در حال نگارش: padding

scalarization

حالتی که field‌های یک شیء به‌صورت مقدارهای مستقل پردازش می‌شوند و نیازی به ساخت شیء جداگانه برای نگهداری آن‌ها نیست.

در حال نگارش: scalarization

allocation

اختصاص فضای حافظه برای نگهداری داده یا یک شیء هنگام اجرای برنامه.

در حال نگارش: allocation

Per-Ake Minborg در مقالهٔ Inside Java نشان می‌دهد چطور می‌توان ticker یک محصول مالی، مانند ORCL یا GOOGL،؜ را با یک value class دارای تنها یک field از نوع int نمایش داد. طبق مقاله، value class‌ها بخشی از JEP 401: Value Objects هستند که به‌صورت preview در JDK 28 ارائه می‌شود؛ این class‌ها identity ندارند.

نمونهٔ Ticker فقط رشته‌های یک تا پنج‌کاراکتری شامل حروف بزرگ A تا Z،؜ رقم‌های 0 تا 9 و نقطه را می‌پذیرد. برای هر یک از این ۳۷ کاراکتر، شش bit در نظر گرفته می‌شود؛ بنابراین پنج کاراکتر در ۳۰ bit جا می‌گیرند و دو bit بالایی int صفر می‌مانند. constructor ورودی خالی، طول بیش از پنج و کاراکتر نامعتبر را رد می‌کند. مقدار صفر برای padding کنار گذاشته شده است تا پایان ticker بدون field جداگانه برای طول مشخص شود.

چیدمان کاراکترها ویژگی مهم دیگری هم دارد: ترتیب عددهای ذخیره‌شده با ترتیب مقایسهٔ رشته‌ها یکسان است. نقطه پیش از رقم‌ها و رقم‌ها پیش از حروف بزرگ قرار می‌گیرند؛ اولین کاراکتر هم در بالاترین جایگاه ذخیره می‌شود. اگر یک ticker ابتدای دیگری باشد، padding صفر باعث می‌شود مورد کوتاه‌تر زودتر قرار بگیرد. در نتیجه، پیاده‌سازی Comparable می‌تواند مستقیماً از Integer.compare استفاده کند و نیازی به decode کردن رشته برای مقایسه ندارد.

پیاده‌سازی CharSequence نیز امکان خواندن طول و کاراکترهای منفرد را فراهم می‌کند. متد length حداکثر پنج جایگاه را بررسی می‌کند و charAt کاراکتر همان جایگاه را استخراج می‌کند؛ هیچ‌کدام String نمی‌سازند. در مقابل، subSequence ابتدا کل مقدار را با toString به String تبدیل می‌کند. همچنین StringBuilder.append(CharSequence) می‌تواند کاراکترهای Ticker را بدون فراخوانی اولیهٔ toString بخواند.

مقاله تأکید می‌کند که JVM در بعضی شرایط می‌تواند این value class را scalarize کند؛ یعنی int آن را مستقیماً میان متغیرهای محلی، آرگومان‌ها و مقدارهای بازگشتی جابه‌جا کند و از allocation یک شیء جداگانه بپرهیزد. این امکان همیشگی نیست. محدودیت پنج‌کاراکتری نیز فقط متعلق به این نمونه است: constructor قالب را بررسی می‌کند، نه حضور ticker در بورس، و نوع مورد استفاده در محیط عملیاتی باید با قواعد بورس یا data feed مربوط سازگار باشد.

نکته کلیدی

محدودیت پنج کاراکتر را قاعدهٔ عمومی ticker فرض نکن؛ قالب بورس یا data feed خودت را بررسی کن. به خاطر بسپار که بررسی کاراکترها در constructor فقط اعتبار قالب را می‌سنجد و وجود واقعی ticker در بورس را تأیید نمی‌کند.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۳)