ورود

View Full Version : تفاوت newInstance() و کلمه کلیدی new



se8820726
سه شنبه 22 بهمن 1392, 20:33 عصر
سلام به تمام دوستان
آقا تا اونجایی که من تو جاوا خوندم وقتی از یه کلاس بخوایم یه نمونه بسازیم از new استفاده میکنیم.
اما تو بعضی جاها دیدم که از newinstance استفاده میکنند.


SAXParserFactory spf = SAXParserFactory.newInstance();


میخواستم بدونم که تفاوت newinstance و new تو چیه ؟؟

cups_of_java
چهارشنبه 23 بهمن 1392, 10:08 صبح
برای ایجاد شی جدید شما فقط کلمه کلیدی یا همون اپراتور new رو داری.
newInstance یه متد استاتیک توی یه کلاسه که برنامه نویس نوشته. تمام این جور متد ها واسه این هستن که شما از اون کلاس ها خودت new نتونی بکنی و باید از طریق API که برنامه نویس برات درست کرده یعنی همین جور متد ها شی بگیری.
این ها رو نمونه هاش رو توی الگوی های Singleton, Factory می تونی ببینی. این الگو ها رو سرچ کن مثالش رو ببین برات روشن میشه کامل

se8820726
پنج شنبه 24 بهمن 1392, 13:25 عصر
چرا میخوان که ما خودمون نتونیم new بگیریم ؟؟
تو سایتای خارجی خوندم ولی اصلا منظورشونو نفهمیدم !!!

محمد فدوی
پنج شنبه 24 بهمن 1392, 14:30 عصر
به نظر من خیلی وقتا ساختن یک کلاس جدید برای انجام یه منظور خاص مقرون به صرفه نیست... یا مثلا بعضی اوقات صرفا برای یکپارچه کردن اطلاعات میشه از کلاس های Factory استفاده کرد.
برای نمونه توی کلاس BorderFactory شما انواع Borderها رو بصورت یکجا میبینی در صورتی که هرکدوم برای خودش یک کلاس مجزا داره (کلاس TitledBorder و متد BorderFactory.createTitledBorder رو مقایسه کن)

از طرفی بعضی اوقات هم مبحث RunTime مهم میشه!! اینو توی حیطه ی JDBC خیلی واضح میشه دید. شما فایل درایور MySQL رو به پروژه ت اضافه می کنی ولی موقعی که میخوای به Database متصل شی مستقیما از درایور MySQL استفاده نمی کنی بلکه از کلاس DriverManager استفاده میکنی که به صورت RunTime مشخص میکنه چه نوع اتصالی رو شما درخواست کردید...


Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "xxxx");


میدونیم که Connection یه Interface هست و نمیشه ازش شیء ساخت! و DiverManager در زمان اجرا با توجه به ورودی های متد getConnection میفهمه شما میخوای به MySQL متصل بشی و یک شیء از نوع com.mysql.jdbc.JDBC4Connection هست که باچند سلسله، در نهایت اینترفیس Connection رو پیاده سازی می کنه، و این تشخیص در زمان اجرا انجام شده و این کار انعطاف پذیری JDBC رو فوق العاده می کنه. این در حالیه که در فریمورکی مثل net. که این کار بطور مستقیم انجام میشه برای هر نوع دیتابیس یه namespace جدا وجود داره!

البته من با کلاس SAXParserFactory آشنا نیستم ولی احتمال داره دلیل چنین کاری یکی از دلایلی باشه که گفتم... اگه سورس این متد رو داری با خوندنش میتونی دلیلش رو بفهمی...
[/LIST]

cups_of_java
پنج شنبه 24 بهمن 1392, 22:19 عصر
چرا میخوان که ما خودمون نتونیم new بگیریم ؟؟
تو سایتای خارجی خوندم ولی اصلا منظورشونو نفهمیدم !!!

به خیلی از دلایل:
1) کنترل روی تعداد اشیایی که از اون کلاس ساخته میشه رو داشته باشن. (مثلن یدونه و نه بیشتر ایجاد شه=الگوی Singleton و یا Poolهای شی)
2) کنترل روی نحوه ایجاد شی: ممکن هست چند شی باید با هم new بشن و یک سری سلسله مراتب پیچیده طی بشه تا شما بتونی با اون کلاس کار کنی. (مثل الگوی Builder)
3) همون طوری که دوستمونم گفتن، گاهی پیاده سازی های مختلفی از یک Interface وجود داره و در زمان اجرا و بسته به شرایط باید بکیش new بشه که شما از قبل در زمان کد زدن نمی دونی چی باید new می کردی. الگو های Factory رو هم نگاه کنی بهت ایده میده...
4) استفاده از Dependency Injection در فریم ورک های برنامه نویسی.