Learn Java
304 subscribers
92 photos
1 video
94 files
84 links
یاد گیری زبان برنامه نویسی جاوا و نکات و مفاهیم
کاربردی ان



@parsa8113
@bardiademon
Download Telegram
تبدیل به یک رشته:
String.ValueOf()
یا + ""
کدام یک؟

غالبا دو روش کلی برای تبدیل به رشته در جاوا وجود دارد یکی استفاده از کلاس String و دیگری جمع کردن ان با یک رشته ی دیگر ...

هدف تبدیل به یک رشته است و نه پیوند رشته!
String.valueOf به یک رشته تبدیل میکند در حالی + "" با یک رشته پیوند میدهد

String.ValueOf :
مستقیما به یک رشته تبدیل میکند

+"":
یک StringBuffer تولید میکنه و بعد به String تبدیل میکنه
پس String.ValueOf روند کمتری رو طی میکنه و مناسب تره...
@this_java
بلوک استاتیک چیست؟

در کلاس های جاوا ما اجازه نداریم متغیر های ثابت استاتیک را (static final) داخل سازنده یا بلوک غیر استاتیک مقدار دهی اولیه کنیم و به ناچار باید داخل static block اونار مقدار دهی کنیم
//this is static block
static {

}

// this is non static block
{
}
اگر متغیر های static final داخل static block مقدار دهی نشه compilation error ارور میگیرید
نکته ی قابل توجه اینه که بلاک استاتیک، تنها یک بار در موقع load شدن کلاس (با اولین access به کلاس، کلاس load می‌شود) فراخوانی می‌شه
@this_java
چرا static block ها در جاوا قبل از constructor اجرا می شوند؟

بلاک استاتیک تنها یکبار و در اولین دسترسی به کلاس اجرا میشود.
درحالیکه constructor در هر زمان که از کلاس یک نمونه ساخته میشود یکبار اجرا میشود.پس لازم است ابتدا محتویات داخل استاتیک که مربوط به آماده سازی خود کلاس است ونه نمونه هاش اجرا شود و سپس یک نمونه از آن ساخته شود.
@this_java
دلیل استفاده نشدن کلمات this و super در متد هاس static چیست؟
this
اشاره به object ای دارد که از روی این کلاس «نمونه سازی» (instantiate) شده است. در حالی که متد های استاتیک، باید بتوانند بدون این که نمونه ای از کلاس ساخته شده باشد کار کنند.
@this_java
آیا اینکه تمام متد های یک سیستم را به صورت static تعریف کنیم موجب بالا بردن performance در سیستم می گردد؟


اینکه از عضو های استاتیک یک کلاس شئ ساخته نمی شود اشتباه است بلکه از اعضای استاتیک یک کلاس در زمان اجرای JVM، اشیاء خاصی در حافظه heap ساخته می شود.

تنها تفاوت performance که می تواند وجود داشته باشد این است که برنامه ای که اعضای استاتیک زیادی دارد زمان شروع بکار (startup) آن بیشتر طول می کشد و در عوض پس از اجرا شدن سریعتر کار می کند.

اما این نکته را هم در نظر بگیرید که مبحث اعضای استاتیک و غیر استاتیک یک کلاس برای طراحی بهتر برنامه تعریف شده اند نه بحث performance و نمی توان بدلیل اینکه اعضای استاتیک، performance زمان اجرای برنامه را بالا می برند تمام اعضا را استاتیک تعریف کرد.
@this_java
چرا نباید در جاوا درون Constructor متد های کلاس را فراخوانی کرد؟

دایتل در آخرین کتاب خود بر خلاف قبل صحت پارامترهای سازنده را توسط فراخوانی متدهای setter در سازنده انجام نمی دهد بلکه شروط متد setter را مجددا در سازنده بازنویسی کرده آیا این کار تاثیری در performance دارد؟

جواب:

دلیل این کار وجود یک violation در مباحث کنترل کیفیت کد است که باعث می شود نتایجی برخلاف آن چیزی که ما توقع داریم اتفاق بیوفتد. در زبان برنامه نویسی جاوا نباید درون Constructor متد هایی که قابل override شدن هستند را فراخوانی کرد (متد های private, static, یا final قابل override شدن نیستند). به این قانون به زبان انگلیسی Ensure that constructors do not call overridable methods می گویند.

در زبان برنامه نویسی جاوا اگر متد یک کلاس در کلاس فرزندش override شده باشد و در Constructor کلاس پدر متد override شده فراخوانی شود، متد override شده در کلاس فرزند استفاده خواهد شد. به کد زیر توجه کنید:

class SuperClass {
public SuperClass () {
doLogic();
}

public void doLogic() {
System.out.println("This is superclass!");
}
}

class SubClass extends SuperClass {
private String color = null;
public SubClass() {
super();
color = "Red";
}

public void doLogic() {
System.out.println("This is subclass! The color is :" + color);
// ...
}
}

public class Overridable {
public static void main(String[] args) {
SuperClass bc = new SuperClass();
// Prints "This is superclass!"
SuperClass sc = new SubClass();
// Prints "This is subclass! The color is :null"
}
}



کد بالا بدون مشکل و خطا اجرا می شود ولی در زمانی که در Constructor کلاس SubClass با استفاده از super سازنده کلاس SuperClass فراخوانی می شود بجای فراخوانی متد doLogic در SuperClass متد doLogic در SubClass فراخوانی می شود.

راه حل:

یا باید متد doLogic را غیرقابل override کرد یا اینکه بدنه متد doLogic را در محل مشخص در Constructor کپی کرد و از متد doLogic صرف نظر کرد.


@this_java
آیا می توان متد که private یا static است را در جاوا override کرد؟
متد های private اصلا در مکانیزم وراثت در جاوا به کلاس فرزند ارث نمی رسند چه برسد به اینکه بخواهیم آنها را override کنیم.
متد های استاتیک یک کلاس را نمی توان override کرد بلکه می توانیم متد های استاتیک یک کلاس را مخفی (hide) کنیم.
@this_java
چرا نمی توان در جاوا متد های استاتیک را override کرد اما در زبان هایی مانند Scala یا Objective-C این کار امکانپذیر است؟

بدلیل اینکه متد های استاتیک در جاوا به اشیاء ساخته شده از یک کلاس تعلق ندارند و اصطلاحا متد های در سطح کلاس هستند و نمی توان آنها را در کلاس فرزند override کرد و اگر یک متد استاتیک در کلاس فرزند دقیقا با همان امضای متد کلاس پدر وجود داشته باشد خطایی رخ نمی دهد و برنامه بدرستی کامپایل می شود.
در این موارد گفته می شود کد متد فرزند متد پدر را hide کرده است و به این کار override گفته نمی شود چون هنوز متد کلاس پدر در سطح همان کلاس قابل دسترسی است.
@this_java
اگر هنوز با Jlink کار نکرده اید، ببینید چه چیزی از ابزار خط فرمان Java 9 می تواند برای کمک به یک JRE سبک وزن، سفارشی ایجاد کند.
معمولا برنامه ما با استفاده از JRE پیش فرض اجرا می شود، اما در صورتی که می خواهید JRE خودتان را ایجاد کنید، می توانید با مفهوم jlink اشنا شوید.

چرا JRE خود را بسازید؟
فرض کنید ما یک برنامه ساده " Hello World !" داریم:
class Test  {

public static void main(String[]args) {

System.out.prinltn("Hello World");

}

}

برای اجرای این برنامه "hello world" کوچک، ما نیاز به کلاس فایل های زیر داریم :


String.class
Test.class
System.class
Object.class
در اینجا، این 4 کلاس برای اجرای برنامه من کافی خواهد بود.

پیش فرض JRE توسط اوراکل شامل 4300 + فایل جاوا کلاس از پیش تعریف شده است .
اگر من درخواست hello world را با JRE پیش فرض اجرا کنم، سپس تمام فایل های کلاس class از پیش تعریف شده اجرا خواهند شد. اما اگر من فقط به فایل های 3-4 .class نیاز داشته باشم که برنامه Hello World را اجرا کنم، پس چرا باید فایل های بیرونی کلاس را حفظ کنم؟

بنابراین مشکل با JRE پیش فرض این است که تمام فایل های .class از پیش تعریف شده را اجرا می کند، آیا می خواهید یا نه.
و اگر شما همچنین به اندازه پیش فرض JRE نگاه کنید، خواهید دید که آن 203 مگابایت است. برای اجرای 1 کیلوبایت ساده من، باید 203 مگابایت JRE را در دستگاه خود نگهداری کنم. این یک اتلاف کامل از حافظه است.

بنابراین استفاده از JRE به طور پیش فرض به این معنی است:

بنابراین جاوا بهترین انتخاب برای سرویس های microservices و IoT نیست، اما این فقط یک مشکل با جاوا 1.8 بود. ولی حالا، جاوا 1.9 با jlink همراه است. با jlink ما می توانیم JRE کوچک خود را که شامل تنها کلاس های مرتبط است که می خواهیم ایجاد کنیم. و از هدر رفتن حافظه جلوگیری و عملکرد نیز افزایش خواهد یافت.

@this_java
همونطور که میدونید java fx از jdk 11 حذف شده ... اگه میخواید ازش استفاده کنید به صورت زیر عمل کنید:

https://dzone.com/articles/javafx-on-jdk-11
و اگر از maven همونطور که میدونید java fx از jdk 11 حذف شده ... اگه میخواید ازش استفاده کنید به صورت زیر عمل کنید:

https://dzone.com/articles/javafx-on-jdk-11
و اگر از maven استفاده میکنید :
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>

@this_java
var چیست؟

نوعی متغیر جدید که در java 10 معرفی شد و میتونه هر نوع مقداری رو توی خودش نگه داره... map عدد رشته لیست url و...
var list = List.of("A", "B", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
در سایت زیر میتونید اطلاعات بیشتری کسب کنید:
https://winterbe.com/posts/2018/09/24/java-11-tutorial/
@this_java
بیشترین زبان های استفاده شده در apache
@this_java
چرا متد main() در جاوا static میباشد؟
زیرا متدهای استاتیک را می توان بدون نمونه سازی(شی ساختن) از یک کلاس صدا زد. و متد ()main قبل از نمونه (شی) ایجاد شده از یک کلاس توسط jvm صدا زده می شود.
خب چرا jvm شی نمیسازه از کلاس و ازون طریق متد main رو صدا نمیزنه؟
واقعیت این هست که ممکنه شما داخل سازنده ی کلاستون یک پارامتر برای ورودی بگیرید... jvm چه داده ای باید پاس کنه به شما؟
یا ممکنه طوری سازنده رو تعریف کنید که jvm قادر به فراخونیش نباشه...

@this_java
مدیریت خطا در جاوا

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

مفهوم Exception
این لغت در فرهنگ واژه به معنای شرایط غیرعادی می باشد.
در جاوا منظور از Exception رویدادی است که روند عادی اجرای برنامه را مختل میکند

شرح مفهوم Exception Handling
به مکانیزیمی که خطاهای رخ داده در زمان اجرای برنامه نظیر ClassNotFound, IO, SQL,Remove و.... را مدیریت میکند

مزایای Exception Handling
مزیت اصلی جلوگیری از قطع جریان و روند عادی برنامه است ...
Exception ها روند عادی برنامه را قطع میکنند به همین خاطر توسعه دهندگان از exception handling استفاده میکنند

انواع Exception ها:
در کل دو نوع وجود دارد: خطاهای زمان کامپایل (checked) و خطاهای زمان اجرا (unchecked)
شرکت sun microsystem خطا هارا به سه بخش تقسیم میکند:
Checked Exception
UnChecked Exception
Error

تفاوت ما بین Checked Exception و UnChecked Exception چیست؟

تمامی کلاس هایی که از Throwable ارث بری کنند Checked Exception هستند به استثنای Error و RunTime Exception
برای مثال : IOException
تمامی کلاس هایی که از Runtime Exception ارث بری دارند تحت عنوان UnChecked Exception خوانده میشوند
برای مثال : NullPointerException
Error:
غیر قابل مدیریت بوده و در صورت رخداد ان امکان بازیابی برنامه وجود ندارد
مثال:
OutOfMemoryError

@this_java
📂 سورس كد اپلیکیشن"music player" به زبان #جاوا

💹 قيمت: رايگان
🛅 پسورد: www.sourcep.ir
🛄 سورس کدهای بیشتر در🔻
🆔 @this_java🎖🎖
#java
آیا می دانید زبان های برنامه نویسی محبوب سالانه چقدر درآمد برای برنامه نویسان دارند؟(دلار)

@this_java
میانگین درامد جاوا کار ها در ایالات متحده

@this_java
منظور از اشیاء POJO در جاوا چیست؟

کلاس های معمولی و بسیار ساده که از کلاس دیگری ارث نبرده اند و جزء فریم ورک و بین نیستند و صرفا برای معرفی و کار با فیلد ها و خاصیت های شی گرفته شده از کلاس می باشند ، یکی از کاربردهای این کلاسها برای معرفی موجودیت های متصل به دیتابیس در Hibernate و Jpa می باشد که کلاس و یا اشیا را به دیتابیس یا فایل Map برقرار میکند.

نمونه کلاس POJO
public class Jdluser implements java.io.Serializable {

private Integer id;
private String name;
private String lastName;
private String email;

public Jdluser() {
}

public Jdluser(String name, String lastName, String email) {
this.name = name;
this.lastName = lastName;
this.email = email;

}

public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public String getLastName() {
return this.lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getEmail() {
return this.email;
}

public void setEmail(String email) {
this.email = email;
}
}

@this_java
اینترفیس ها در جاوا از کلاس Object ارث بری نکرده اند اما چرا برخی از متد ها آن را می توان در اینترفیس override کرد؟
در زبان برنامه نویسی جاوا فقط کلاس ها فرزند کلاس Object هستند. برای توجیح مورد فوق نیز بر اساس بند 9.2 در Java language Specification اگر یک interface بصورت مستقیم فرزند هیچ interface دیگری نباشد، به ازای تمامی متد های public کلاس Object یک متد ضمنی (implicit) که abstract و public است در آن interface تعریف می شود.

https://stackoverflow.com/questions/6056124/do-interfaces-inherit-from-object-class-in-java

@this_java
👍2