PDA

View Full Version : JDK7



jReihane
پنج شنبه 11 شهریور 1389, 02:36 صبح
سلام،
راستش من نمي دونستم اين تاپيك رو توي اين فروم بايد بذارم يا J2se ... به بزرگي خودتون ببخشيد!
همونطور كه مي دونين java7 مدتيه كه معرفي شده و داره استفاده مي شه. توي اين تاپيك مي خوام قابليتهاي java7 رو بررسي كنم. شما هم هر قابليت ديگه اي كه مي دونين لطفا بگين.
اوليش قابليت تعريف collection ها به صورت ساده هست. مثلا به جاي اينكه اول يه نمونه تعريف كنين بعد ري به ري بهش داده هاتونو اضافه (Add) كنين بعد با متدي شبيه get() ازش مقادير مورد نظرتون رو بخونين همه كارها رو يهو انجام بدين.
مثال زير اين موضوع رو واضحتر نشون مي ده:
در حالت jdk6:


List<String> list = new ArrayList<String>();
list.add("item");
String item = list.get(0);

Set<String> set = new HashSet<String>();
set.add("item");

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("key", 1);
int value = map.get("key")

اما در jdk7 به صورت زير خواهد بود:


List<String> list = ["item"];
String item = list[0];
Set<String> set = {"item"};
Map<String, Integer> map = {"key" : 1};
int value = map["key"];
در واقع خاصيتي كه توي نوع داده هايي مثل array ها هست به collection ها هم داده شده و اين كار روي خيلي راحتتر مي كنه.
مورد بعدي مشكليه كه شايد بهش برخورده باشين. مثلا بعد از استفاده از stream ها، يادتون رفته باشه اونها رو close كنين.
توي jdk7 اين كار به صورت خودكار انجام مي شه البته با تغييري كه تويsyntax مربوط به try/catch داده شده. مثلا قبلا مي نوشتيم:


BufferedReader br = new BufferedReader(new FileReader(path));
try { return br.readLine();}
finally { br.close();}

اما با jdk7 مي تونيم بنويسيم:


try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();}

اين يكي براي من كه خيلي جالب بود!
البته مي تونين چند تا متغير رو توي try بنويسين. فقط بايد با ";" اونها رو از هم جدا كنين.
ويژگي بعدي مربوط به يكي از ويژگي هاي java6 هست كه در جاي خودش خيلي جالب هست اما توي مواردي آزار دهنده مي شه، و اون همون Generic Instance هست:


Map<String, List<String>> anagrams =
new HashMap<String, List<String>>();

براي تعريف يه متغير به نظر كار زيادي مياد!
الان مي تونيم به جاي كد بالا بنويسيم:

Map<String, List<String>> anagrams = new HashMap<>();
باز كمتر شد!
و اما براي تعريف اعداد بزرگ هم كه مي تونن گيج كننده باشن قابليتي اضافه شده كه به شما اجازه مي ده موقع مقدار دهي به يه عدد صحيح از "_" استفاده كنين:


int one_million = 1_000_000;


API هاي JAXP, JAXB, and JAX-WS هم براي سازگار بودن با آخرين نسخه هاي XML به روز شده ان.
همينطور API هاي جديدي به پكيج nio اضافه شدن.
مثلا كلاس Path كه شبيه به همون كلاس File هست با اين تفاوت كه امكانات بيشتري داره. مثلا مي تونين يه مسير رو بين دو تا مسير ايجاد كنيد:


Path p1 = Paths.get("joe");Path p2 = Paths.get("sally");
Path p1_to_p2 = p1.relativize(p2); // Result is ../sally

يعني يه مسير كه از p1 شروع مي شه و به p2 ختم مي شه.
يا Interfaceاي مثل FileVisitor كه به شما اين امكان رو مي ده كه توي يه مسير، روي تمام فايل ها يا تعدادي از فايلها يك عمليات يكسان انجام بدين. مثلا همه شونو پاك كنين! يه مثال از استفاده از اين interface:


//Print information about each type of file. @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
if (attr.isSymbolicLink()) {
System.out.format("Symbolic link: %s ", file); }
else if (attr.isRegularFile()) {
System.out.format("Regular file: %s ", file); }
else {
System.out.format("Other: %s ", file); }
System.out.println("(" + attr.size() + "bytes)");
return CONTINUE; } و ...
اما از چيزهايي كه بعد از كلي سر و صدا و خواهش پروپوزال (!) اضافه كردن closure ها هست. Closure ها همونطور كه مي دونين بلاك هاي كدي هستند كه مي تونن وسط كد بيان... درواقع اونها رو متدهاي بي نام هم تعبير كردن. مثلا توي جاوا چنين چيزي تا حالا ممكن نبود:



boolean even = { int x => x % 2 == 0 }.invoke(15);

اما الان يك چنين متدي كاملا قابل قبوله:


public Collection<Book> getPublishedBooks(Collection<Book> books) {
return select(books, {Book book => book.isPublished()});}

Annotation ها هم ارتقا پيدا كردن و type annotationرو به وجود آوردن ... با مثال بگم:



List<@NonNull Object>

موارد ديگه اي هم هست كه اكثرا مربوط به Swing و Java 2D هستند. مثلا تقويم جديدي كه به swing اضافه شده.
يكي از مهمترين موارد Modularization هست. تعريفي كه Mark Reinhold مي گه اينه:
مثلا شما براي برنامه اي كه مي خوايد بنويسيد به CORBA احتياجي نداريد. خب اين قسمت از jdk رو به برنامه تون اضافه نمي كنين!!! ... درواقع jdk رو به بخش هاي مجزا تقسيم مي كنيم تا هر كس با توجه به سيستمي كه مي خواد طراحي كنه (مثلا براي موبايل) هر قسمتي از jdk رو كه لازم داره برداره.
خدا خيرشون بده!
اما مسئله اي كه شايد خيلي براي ما كاربردي نباشه قابليتيه كه به java براي پردازش dynamic programming languages اضافه شده. راستش من خيلي نفهميدم چي كار كردن كه چي شده!
Garbage collector هم بهبود پيدا كرده تا زمان كمتري براي collect كردن صرف كنه.
چند وقت قبل Mark Reinhold توي يكي از PodCast هاي اوراكل (TechCast) شركت و در مورد مهمترين ويژگي هاي java7 صحبت كرد. اين پادكست رو مي تونين از اين لينك (https://channelsun.sun.com/media/show/15028) ببينين... البته اميدوارم شما رو به اندازه من منتظر نذاره!!!!
اگر ايرادي مي بينين خوشحال ميشم بگين...

منابع:
http://www.blog.dannynet.net/archives/87 ---- closure
http://www.javaworld.com/javaworld/jw-06-2008/jw-06-closures.html?page=5 --- closure proposals
http://tronicek.blogspot.com/2007/12/java-closures-tutorial.html ---- closure tutorial
http://openjdk.java.net/projects/jdk7/features/ --- jdk7 features
http://www.oracle.com/technetwork/java/7-138633.html --- jdk7 features
http://code.joejag.com/2009/new-language-features-in-java-7/ --- jdk7 features
https://channelsun.sun.com/media/show/15028 --- jdk7 features mark reinhold
http://java.sun.com/developer/technicalArticles/javase/nio/ --- java7 nio