خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
SHOW FULL COLUMNS FROM `wp_options`

خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format', 'hashtags') AND tr.object_id IN (2618) ORDER BY t.name ASC

آموزش قدم به قدم جاوا - قسمت دوازدهم - Hive | مجله توسعه‌دهندگان وب
  • شاخه: دسته‌بندی نشده    ::    بازدید: ۷۸۷
  • ۴

آموزش قدم به قدم جاوا – قسمت دوازدهم

سازنده‌ها (Constructors)

یکی از مهم‌ترین اعضای هر کلاس سازنده آن کلاس است. همه‌ی کلاس‌ها سازنده دارند حتی اگر ما برای آن کلاس سازنده‌ای تعریف نکنیم. اگر برای یک کلاس سازنده‌ای تعریف نکنیم آن‌گاه آن کلاس سازنده‌ای به نام default constructor یا سازنده پیش‌فرض خواهد داشت. اصلی‌ترین وظیفه سازنده مقداردهی اولیه به فیلدهای یک شی است.

شاید این سوال برایتان پیش بیاید که برای مقداردهی به فیلدها می‌توانیم از متدهایی که برای مقداردهی استفاده می‌کردیم استفاده کنیم و چه نیازی به سازنده وجود دارد؟ شاید بتوان از این روش هم استفاده کرد اما هیچ برنامه‌نویسی این کار را انجام نمی‌دهد! یکی از دلایل آن اینست که در این روش احتمال فراموش‌کردن مقداردهی به یک فیلد بسیار زیاد است، اما اگر از سازنده استفاده کنید مجبور خواهید شد که هنگام ایجاد شی تمام فیلدهای آن را مقداردهی کنید.

البته در سازنده فقط محدود به مقداردهی به فیلدها نیستیم و می‌توانیم مثلا چند متد را هم فراخوانی کنیم اما معمولا برای مقداردهی اولیه به فیلدها از آن استفاده می‌شود.

اما سازنده چه زمانی فراخوانی می‌شود؟ به شکل زیر توجه کنید:

jc1

همانطور که می‌دانید وظیفه دستور new ایجاد یک شی در حافظه و برگرداندن آدرس آن می‌باشد. کلاس Car که در این شکل یک شی از آن ساختیم بدون سازنده است. در کادر قرمز رنگ که مشخص شده، سازنده پیش‌فرض کلاس Car فراخوانی می‌شود یعنی عملگر new سازنده کلاس را فراخوانی می‌کند. پس همانطور که دیدید سازنده کلاس دقیقا در لحظه ایجاد یک شی از آن کلاس فراخوانی می‌شود.

شکل کلی تعریف یک سازنده به صورت زیر است:

نام کلاس تعیین کننده دسترسی() {

}

سازنده‌ها مانند متدها تعریف می‌شوند با این تفاوت که سازنده‌ها نوع داده برگشتی ندارند.

تعیین‌کننده دسترسی سازنده‌ها معمولا متناسب با تعیین‌کننده دسترسی کلاس آن تعریف می‌شود. یعنی اگر کلاس public بود سازنده هم public و اگر کلاس package-private بود سازنده آن هم package-private تعریف می‌کنیم. اگر در یک کلاس public یک سازنده package-private تعریف کنید آن‌گاه نمی‌توانید در خارج از پکیج آن کلاس از آن شی بسازید اگرچه کلاس شما public است و می‌تواند در پکیج‌های دیگر استفاده شود اما چون سازنده package-private است بنابراین نمی‌توان برای ایجاد شی در خارج از پکیج آن را فراخوانی کرد و ایجاد شی غیرممکن می‌شود.

مثال: کلاسی به نام Car با چند مشخصه داریم که یک سازنده هم برای آن تعریف کردیم. یک کلاس جدید در ایکلیپس ساخته و کدهای زیر را در آن بنویسید:

در خط اول سازنده برای نشان‌دادن این‌که سازنده کی فراخوانی می‌شود یک دستور چاپ نوشتیم که عبارت “سازنده فراخوانی شده است” را چاپ می‌کند. در خطوط بعدی مشخصه‌ها را مقداردهی اولیه کردیم. حالا در کلاس اصلی برنامه خود در متد main یک شی از این کلاس بسازید و برنامه را اجرا کنید. می‌بینید که عبارت Constructor is called در کنسول چاپ خواهد شد.

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

سازنده‌های پارامتر دار

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

سازنده ای که برای کلاس Car نوشته بودیم را تغییر دادیم تا سه پارامتر دریافت کند. پارامترها با علامت , از هم جدا شده‌اند. همانطور که می‌بینید نام پارامترها با نام فیلدهای کلاس یکی است (اگرچه مجبور به این کار نبودیم و می‌توانستیم نام دیگری برای پارامترها انتخاب کنیم) اما چون نام پارامترها و فیلدها عین هم هستند بنابراین در بدنه کلاس قبل از نام فیلدها عبارت this و یک نقطه نوشتیم. چون اگر سازنده را به صورت زیر می‌نوشتیم:

 

آن‌گاه نام پارامترها با نام فیلدها تداخل پیدا می‌کردند به همین دلیل با عبارت this به کامپایلر می‌گوییم که منظور از مثلا this.fuel فیلد fuel است نه پارامتر سازنده.

حال که سازنده کلاس ما پارامتردار است دیگر نمی‌توانیم به این صورت از آن شی بسازیم:

چون در این کد عملگر new می‌خواهد یک سازنده بدون پارامتر از کلاس Car را فراخوانی کند در صورتی که الان چنین سازنده‌ای در کلاس ما وجود ندارد پس خطا رخ خواهد داد. بنابراین باید پارامترهایی که در کلاس خود برای سازنده تعریف کردیم را هنگام ایجاد شی به سازنده بدهیم. مثال:

نکته: ترتیب مقداردهی به پارامترهای سازنده باید دقیقا مطابق ترتیبی باشد که برای سازنده تعریف شده است مثلا در کد قبل نمی‌توانید true را به جای 30 بنویسید.

پاک‌سازی حافظه (Garbage Collection)

همانطور که می‌دانید هر شیئی که ایجاد می‌کنیم قسمتی از حافظه را اشغال می‌کند. حال اگر در یک برنامه تعداد زیادی شی ایجاد کنیم ممکن است با کمبود حافظه مواجه شویم. در زبان‌هایی مثل C++ مدیریت حافظه به عهده برنامه‌نویس است اما در جاوا این کار به صورت خودکار انجام می‌شود یعنی اگر حجم اشغال حافظه یک برنامه از حد مشخصی بیشتر شود آن‌گاه پاک‌ساز حافظه (Garbage Collector) شروع به کار می‌کند و اشیائی که دیگر مورد نیاز برنامه نیستند را از حافظه پاک می‌کند. عمل پاک‌سازی حافظه زمان بر است و بنابراین این کار فقط در مواقع ضروری انجام می‌شود.

متد finalize

متد finalize دقیقا قبل از پاک‌سازی شی توسط Garbage Collector فراخوانی می‌شود و برای استفاده از این متد و تعریف این‌که چه کاری باید در این متد انجام شود باید کد زیر را در کلاس خود بنویسید:

دلیل این‌که چرا باید این متد را عینا به همین شکل در کلاس نوشت را در قسمت وراثت متوجه خواهید شد.

حال می‌توانید در بدنه متد کارهایی که باید هنگام فراخوانی این متد انجام شود را بنویسید. می‌توانید با یک دستور چاپ آن را تست کنید.

نکته: از این متد به ندرت در برنامه‌نویسی استفاده می‌شود و در اکثر برنامه‌ها نیازی به پیاده‌سازی این متد نیست و فقط در بعضی موارد خاص این متد به کار می‌آید. حتی در برخی منابع جاوا استفاده از این متد را به شدت منع کرده‌اند! بنابراین فقط آشنایی کلی با این متد کافیست.

مصطفی نصیری

دانشجوی نرم افزار هستم و علاقه شدیدی به برنامه نویسی مخصوصا با زبان جاوا دارم! در حال حاضر تمرکزم روی اندرویده. دوست دارم چیزایی که یاد میگیرم رو با بقیه به اشتراک بگذارم :)

همچنین ممکن است دوست داشته باشید ...

خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category') AND tr.object_id IN (1103) ORDER BY t.name ASC

خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_tag') AND tr.object_id IN (1103) ORDER BY t.name ASC

خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('hashtags') AND tr.object_id IN (1103) ORDER BY t.name ASC

class="post-1103 post type-post status-publish format-standard has-post-thumbnail hentry">
۲
  • خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_format') AND tr.object_id IN (834) ORDER BY t.name ASC

  • خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category') AND tr.object_id IN (834) ORDER BY t.name ASC

    خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_tag') AND tr.object_id IN (834) ORDER BY t.name ASC

    خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('hashtags') AND tr.object_id IN (834) ORDER BY t.name ASC

    class="post-834 post type-post status-publish format-standard has-post-thumbnail hentry">
    ۶
  • خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_format') AND tr.object_id IN (153) ORDER BY t.name ASC

  • خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category') AND tr.object_id IN (153) ORDER BY t.name ASC

    خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_tag') AND tr.object_id IN (153) ORDER BY t.name ASC

    خطای پایگاه‌داده وردپرس: [Got error 28 from storage engine]
    SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('hashtags') AND tr.object_id IN (153) ORDER BY t.name ASC

    class="post-153 post type-post status-publish format-standard has-post-thumbnail hentry">
    ۰

    ۴ واکنش

    1. ایمان گفت:

      بسیار عالی

    2. سهیلا گفت:

      سلام خسته نباشین ممنون از سایت خوبتون 🙂
      به نظرم در قسمت سازنده های پارامتر دار اشتباهی شده به نظرم باید به اینصورت نوشته میشدن
      public Car(boolean isStarted, int fuel, int currentSpeed) {
      this.isStarted = isStarted;
      this.fuel = fuel;
      this.currentSpeed = currentSpeed;
      }

    3. برانیکو گفت:

      بسیار مفید فایده قرار گرفت ضمن اینکه به شدت دنبال مطلبی میگشتم به به چنین واضحی توضیح بدهد

    پاسخ دهید

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *