استفاده از خصیصهها در جاوا ۸
خصیصهها(traits) در زبان اسکالا و PHP مدتی است حضور دارند اما به نسبت در جاوا موضوع جدیدی به حساب میآیند. در ادامه یک مثال کوتاه از نحوه استفاده از خصیصهها در جاوا ۸ نشان خواهیم داد.
استفاده از خصیصهها در جاوا ۸ از طریق توابع پیشفرض میسر است. در این مقاله در مورد موارد استفاده از خصیصهها صحبت نمیکنیم، اما یک حقه ساده معرفی میکنیم که شما میتوانید از این طریق به راحتی روی اشیا مختلف stream بزنید و اشیائی که خصیصه مورد نظر را برآورده میکنند را جدا کنید.
فرض کنید که دو کلاس Person و Elephant دارید. هیچ دلیلی ندارد که این دو کلاس به یک ابر کلاس یکسان متعلق باشند. فیلها موجودات باهوش و چهارپایی هستند در حالیکه اغلب مردم اینگونه نیستند!
اما ممکن است شما دو تا از آنها را در یک کامپیوتر بیابید که نیاز داشته باشید در یک مجموعه(Collection) آنها را ذخیره کنید. یک راه برای انجام عملیات روی این مجموعه متنوع از جانداران بدون داشتن اجداد مشترک استفاده از خصیصههای یکسان است.
به واسط کاربری زیر نگاه کنید:
interface HasName extends Document { final String NAME = "name"; default String getName() { return get(NAME); } default void setName(String name) { return put(NAME, name); } }
با استفاده از الگوی Abstract Document این خصیصه میتواند صفت نام را از روی یک set، map و get کند. حال اگر ما بخواهیم روی این مجموعه که ممکن است این خصیصه را پیادهسازی کرده باشند یا خیر حرکت کنیم میتوانیم به این شکل انجام دهیم:
final Set<Object> livingBeings = new HashSet<>(); livingBeings.add(new Person(...)); livingBeings.add(new Person(...)); livingBeings.add(new Elephant(...)); livingBeings.stream() .filter(HasName.class::isInstance) .filter(HasAge.class::isInstance) .filter(HasWeight.class::isInstance) .map(p -> (HasName & HasAge & HasHeight) p) .forEach(p -> System.out.println( p.getName() + " is " + p.getAge() + " years old and weighs " + p.getWeight() + " pounds." ) );
به این ترتیب با استفاده از کاراکتر & توانستهایم نمونههایی که همه خصیصههای مورد نظر را پیادهسازی کردهاند به یک نوعداده داینامیک cast کنیم بدون اینکه یک جد مشترک برای آنان قائل شده باشیم.
منبع: