کد بوی 281 – هنگامی که برابر و هش کدها بد رفتار می کنند

مجموعه های شکست برابر () و hashCode() نامناسب.

مشکلات

  • کمترین تعجب نقض اصل
  • نقض قرارداد
  • مسائل کلیدی قابل تغییر
  • کدهای هش تکراری
  • اشکال زدایی سخت می شود
  • توزیع هش ضعیف

راه حل ها

  1. از کلیدهای قابل تغییر اجتناب کنید
  2. از هش های موثر استفاده کنید
  3. رفتار را با دقت تست کنید
  4. از تعریف مجدد برابر و هش خودداری کنید
  5. به Bijection احترام بگذارید

زمینه

وقتی با مجموعه های هش شده کار می کنید مانند HashMap یا HashSet، باید توجه ویژه ای داشته باشید برابر () و hashCode().

عدم تطابق یا اجرای ضعیف می تواند منجر به اشکالات غیرقابل پیش بینی شود.

برابر () روش برابری منطقی را تعریف می کند، در حالی که hashCode() سطل یک شی را برای دسترسی سریعتر تعیین می کند.

هنگامی که این دو روش با هم هماهنگ نمی شوند، مجموعه ها قابلیت اطمینان خود را از دست می دهند که منجر به عملکرد ضعیف یا مشکلاتی مانند ورودی های تکراری ناشی از مجموعه های هش می شود.

بهترین راه حل این است که هرگز هش و برابر را نادیده نگیریم و بر هویت شی تکیه کنیم.

این همان چیزی است که در دنیای واقعی با استفاده از MAPPER اتفاق می افتد).

هر زمان که یک شی خارجی دریافت می کنید، باید آن را به مکاتبات بیجکشن خود نگاشت کنید و یک شی کاملا جدید ایجاد نکنید.

هنگامی که در سیستم کنترل شده خود قرار گرفتید، به هویت تکیه کنید و مسائل برابری را فراموش کنید.

کد نمونه

اشتباه است

class BrokenObject {
    private int value;

    public BrokenObject(int value) {
        this.value = value;
    }

   ...

Source link