معما: نام کلاس

بیایید این بار یک معمای ساده ولی مهم تعریف کنیم.
کد زیر را بخوانید و خروجی آن را حدس بزنید. سپس آن را اجرا کنید و دلیل خروجی را پیدا کنید.
public class StringClass { public static void main(String[] args) { int a = 10 + 20; System.out.println(a); } } class String { private final String str; public String(String str) { this.str = str; } }
اگر کد را اجرا کنید خطای زیر را دریافت خواهید کرد
Error: Main method not found in class StringClass, please define the main method as: public static void main(String[] args) ...
پس بر اساس این خطا لازم است که متد main را تعریف کنیم. اما عجیب این است که متد main تعریف شده است. احتمالا متوجه شدهاید که کلاس String چون به طور پیشفرض در کلاس اصلی حاضر است نباید تعریف شود. اما پیغام خطا اشارهای به آن ندارد.
در حقیقت پیام خطا درست است. ما متد main با signature مورد انتظار را نداریم. متد main یک آرایه String را به عنوان آرگومان ورودی باید داشته باشد اما در کد ما آرایه String به کلاس Stringای که در این کد تعریف کردهایم کامپایل میشود نه java.lang.String
کاری که برای برطرف کردن خطا میتوان کرد این است که متد main را به این شکل تغییر دهیم
public static void main(java.lang.String[] args)
حال مطمئن هستیم که کلاس String از بسته مورد انتظار فراخوانی شده است.
از این مساله نتیجه میگیریم که نباید در نامگذاری کلاسهای شخصی خودمان از اسامی کلاسهای استاندارد استفاده کنیم وگرنه منجر به رفتارهای غیرقابل پیشبینی میشود و خواندن کدتان را برای دیگران به یک کابوس تبدیل میکند.
منبع: