จะปรับการโยกย้ายจาก Java 6 เป็น Java 7 ได้อย่างไร


28

เราถูกย้ายจากJava 6เพื่อJava 7 โครงการนี้ล่าช้ากว่ากำหนดและความเสี่ยงจะลดลงในกรณีนี้จะยังคงใช้ Java 6 ต่อไป

อะไรคือการปรับปรุงเฉพาะใน Java 7 ที่เราสามารถกลับไปที่ผู้จัดการของเราด้วยและโน้มน้าวเขาว่ามันสำคัญที่จะต้องใช้ JDK 7? กำลังมองหาการแก้ไขข้อบกพร่องที่ฉันสามารถเน้นได้ใน Oracle Java 7 (เทียบกับ Java 6) การแก้ไขในด้านความปลอดภัยประสิทธิภาพการทำงานJava 2D / การพิมพ์ ฯลฯ จะขายได้มากกว่าในกรณีของฉัน คอมไพเลอร์แก้ไขเช่นจะไม่ใช้มาก

[ฉันกำลังดูเว็บไซต์จำนวนมากเช่นคู่มือการใช้งาน Oracle , ฐานข้อมูลบั๊ก, คำถามเกี่ยวกับ Stack Overflow]

ปรับปรุง: ขอบคุณสำหรับคำตอบ เรากำหนดเวลาอัปเดตเป็นรุ่นถัดไปอีกครั้ง ที่ใกล้ที่สุดที่เราได้รับคือความปลอดภัย ยอมรับคำตอบที่โหวตสูงสุด


5
คุณโชคดี. เมื่อพิจารณาจากคำถามที่ยังคงปรากฏขึ้นเป็นประจำในStack Overflowบางคนยังคงติดอยู่กับ Java 1.4 (แพลตฟอร์มที่มีอายุ 11 ปี!)
โจอาคิมซาวเออร์

3
ทำไมคุณถึงทำการอัพเกรดตอนนี้ถ้าคุณยังไม่รู้คุณสมบัติบางอย่างใน 7 ที่คุณต้องการ? บางทีคุณอาจจะเสียเวลาของคุณและควรคิดเกี่ยวกับอีกเล็กน้อยเกี่ยวกับว่า คุณควรจะปรับมันมากกว่าวิธีการที่คุณควรจะปรับมัน
Bryan Oakley

1
มันเป็นเพียงฉันหรือเป็นชื่อไปข้างหลัง?
Radu Murzea

1
คำถามที่ใหญ่กว่าคือ: ทำไมคุณถึงมีเวลาอัพเกรดยาก ฉันสามารถอัพเกรดโครงการล้าน loc ในหนึ่งสัปดาห์เป็น Java 7 ฉันคิดว่าคำตอบสำหรับปัญหาของคุณคือการวิเคราะห์ว่าทำไมคุณถึงมีปัญหาในการอัพเกรด
Andrew T Finnell

2
@ Andrew Finnell: ขออภัย ฉันไม่คิดว่ามันเกี่ยวข้อง การย้ายที่แท้จริงเสร็จสมบูรณ์ในเวลาน้อยกว่าหนึ่งสัปดาห์ สาเหตุหลักมาจาก api ที่เราใช้กัน มันเป็นฟังก์ชั่นการทำงานร่วมกันของรหัสที่ได้รับผลกระทบมากกว่าจำนวนบรรทัดของรหัสที่แท้จริง ความล่าช้าที่เกิดขึ้นนั้นเกิดจากปัจจัยหลายอย่างเช่นการสนับสนุนเครื่องมือ - เช่นการครอบคลุมโค้ดโดยใช้ cobertura 2.0 เป็นเพียงความมั่นคง เครื่องมืออีกอย่างคือ Rational Functional Tester ซึ่งต้องการการอัพเกรด (เราเลือกที่จะไม่ทำ) อาจจะเป็นผมจะเขียนบันทึกอยู่กับปัจจัยโดยรวมได้รับผลกระทบความพยายาม ..
จายาน

คำตอบ:


44

Java 6 มาถึง EOL ในเดือนกุมภาพันธ์ปีนี้และจะไม่ได้รับการอัพเดทสาธารณะอีกต่อไป (รวมถึงความปลอดภัย) เว้นแต่คุณจะซื้อการสนับสนุนองค์กรที่มีราคาแพงมาก

นั่นควรเป็นเหตุผลทั้งหมดที่จำเป็น

นอกจากนี้ยังมีหลักฐานที่แสดงให้เห็นว่าความเข้ากันได้ของ Java runtimes นั้นยอดเยี่ยม โอกาสที่คุณจะต้องแทนที่การติดตั้ง Java 6 ด้วย Java 7 และแอปพลิเคชันทั้งหมดจะยังคงทำงานต่อไปได้โดยไม่มีปัญหาใด ๆ ของหลักสูตรนี้ไม่รับประกันและแนะนำให้ทำการทดสอบเพื่อยืนยันว่าจะไม่มีปัญหาแน่นอน


2
นั่นควรเป็นคำตอบที่ยอมรับได้ เหตุผลตามวันที่ EOL ได้พิสูจน์แล้วว่าทำงานได้ดีที่สุดสำหรับฉันเมื่อใดก็ตามที่มีความจำเป็นต้องปรับการอัพเดตผลิตภัณฑ์เฉพาะโดยเฉพาะอย่างยิ่ง Java เพื่อให้การจัดทำเสร็จสมบูรณ์ฉันจะเพิ่มหมายเหตุเกี่ยวกับความเข้ากันได้ของไบนารีย้อนหลัง (ควรสำรองข้อมูลโดยใช้คำสั่ง Oracle อย่างเป็นทางการ) และหมายเหตุเกี่ยวกับความจำเป็นในการทดสอบการอัปเดตควัน (สำหรับกรณีเช่น 6 "ในการกำหนดค่าแอปพลิเคชัน)
gnat

1
เป็นเพียงเหตุผลเดียวที่ บริษัท ส่วนใหญ่จะอัปเกรด
jwenting

Michael มันจะสมเหตุสมผลหรือไม่ที่จะเพิ่มบันทึกย่อที่ฉันพูดถึง ( คำชี้แจงเกี่ยวกับความเข้ากันได้และการทดสอบควัน ) ในคำตอบของคุณ? เพื่อประโยชน์ของความสมบูรณ์ดังนั้นพูด
ริ้น

1
@gnat: เสร็จแล้ว แต่ฉันสงสัยว่าคนที่ต่อต้านการย้ายถิ่นจำเป็นต้องได้รับการบอกกล่าวเกี่ยวกับความจำเป็นในการทดสอบและมากกว่าแค่การทดสอบควันด้วย แน่นอนว่าบางครั้งก็มีความไม่ลงรอยกันที่ร้ายแรง
Michael Borgwardt

@MichaelBorgwardt บอกได้ว่ามันเป็นเรื่องที่ค่อนข้างยุ่งยากและมันก็มีอะไรที่ต้องทำมากกว่าการบังคับมากกว่าเทคนิคที่ถูกต้อง ฉันได้เรียนรู้วิธีที่ค่อนข้างยากในการพูดถึงสิ่งต่าง ๆ เช่นนั้นอย่างชัดเจนและชัดเจนเมื่อมีคน "ต่อต้านการเปลี่ยนแปลง" การส่งสัญญาณแบบนี้ "เราฟังและแบ่งปันความกังวลของคุณและเราก็กังวลเช่นกัน" ทำให้พวกเขารู้สึกว่ามีคุณค่า (เมื่อเทียบกับการเพิกเฉย) ... และในที่สุดก็นำไปสู่การอนุมัติการเปลี่ยนแปลงได้ง่ายขึ้น :)
gnat

29

โดยทั่วไปมีการเปลี่ยนแปลงในวงกว้างพอสมควรเพื่อให้ผู้เขียนโปรแกรมสามารถทำสิ่งต่างๆได้ง่ายขึ้น ผู้จัดการของคุณอาจไม่สนใจสิ่งต่าง ๆ มากนัก แต่การทำให้โปรแกรมเมอร์ใช้เวลาคิดน้อยลงเกี่ยวกับรหัสสำเร็จรูปและมีเวลามากขึ้นที่จะคิดเกี่ยวกับเป้าหมายที่แท้จริงของสิ่งที่พวกเขากำลังนำไปใช้ควรเพิ่มประสิทธิภาพลดข้อบกพร่อง ฯลฯ ซึ่งอาจเป็นข้อโต้แย้งที่ทรงพลังมาก Oracle มีรายการการเปลี่ยนแปลงค่อนข้างครอบคลุมแต่ค่อนข้างยาวดังนั้นฉันจะสรุปให้มากที่สุด

คุณสมบัติภาษารวมถึง:

  • สำเร็จรูปน้อยลงใน Generics รหัสสามารถลดลงได้Map<String, String> myMap = new HashMap<String, String>(); Map<String, String> myMap = new HashMap<>()คอมไพเลอร์สามารถอนุมาน Generic ประเภทที่ต้องการทางด้านขวาจากด้านซ้ายดังนั้นโค้ดของคุณจะสั้นลงและอ่านได้เร็วขึ้นเล็กน้อย
  • Strings ทำงานในงบสวิทช์ในขณะนี้โดยใช้ความหมายของวิธีการแทน.equals()==
  • การจัดการทรัพยากรอัตโนมัติโดยใช้การลองกับทรัพยากร สิ่งนี้ทำให้โค้ดสะอาดขึ้น แต่ยังมีข้อได้เปรียบเหนือลองโค้ดเก่า / สุดท้าย หากมีข้อผิดพลาดเกิดขึ้นในคำสั่งลองและอีกรายการหนึ่งถูกโยนทิ้งในขณะที่ปิดรหัสที่ใช้คำสั่งลอง / ในที่สุดแบบดั้งเดิมจะสูญเสียข้อยกเว้นเดิมโดยสิ้นเชิง ในคำสั่งลองกับทรัพยากรรันไทม์จะระงับข้อยกเว้นที่เรียกปิด () เรียกและฟองข้อยกเว้นเดิมขึ้นสแต็คภายใต้สมมติฐานว่าข้อยกเว้นเดิมนี้เป็นคนที่ทำให้เกิดปัญหาทั้งหมดในครั้งแรก สถานที่. นอกจากนี้แทนการละทิ้งข้อยกเว้นอื่น ๆ Throwable.getSuppressedเพื่อเก็บขยะการปราบปรามนี้จะช่วยให้ข้อยกเว้นอย่างใกล้ชิดโยนไปที่จะเรียกใช้
  • ตัวอักษรตัวเลขสามารถอ่านได้ง่ายขึ้น ตัวอักษรที่เป็นตัวเลขทั้งหมดอนุญาตให้ขีดเส้นใต้ได้ดังนั้นสิ่งต่าง ๆint n = 1000000000สามารถทำให้อ่านได้ง่ายขึ้นint n = 1_000_000_000ซึ่งง่ายกว่ามากในการแยกวิเคราะห์ว่าเป็นหนึ่งพันล้านและพิมพ์ผิดโดยไม่สังเกตเห็นได้ยาก นอกจากนี้ยังอนุญาตให้ใช้ตัวอักษรแบบไบนารีในรูปแบบ0b10110101ทำให้รหัสที่ทำงานกับบิตฟิลด์มีขนาดเล็กกว่าเพื่ออ่าน
  • การจัดการกับชนิดข้อยกเว้นหลายชนิดในแบบเดียวกันนั้นสามารถทำได้โดยลดคำสั่งที่ซ้ำกันและทำให้ง่ายต่อการปรับโครงสร้างในภายหลัง

การเปลี่ยนแปลงเหล่านี้ทุกอย่างเป็นสิ่งที่ผู้จัดการของคุณอาจไม่สนใจโดยตรง แต่พวกเขาทำให้การเขียนโค้ดที่ถูกต้องง่ายขึ้นโดยไม่ต้องใช้ความพยายามและความคิดมากนักปล่อยให้สมองจดจ่อกับตรรกะที่คุณพยายาม ในการใช้งานและพวกเขาทำให้การอ่านโค้ดในภายหลังง่ายขึ้นอีกเล็กน้อยทำให้การดีบักเร็วขึ้นเล็กน้อย

ที่ด้าน API มีการอัปเดต API จำนวนมากเกิดขึ้นเช่นกัน:

  • ความปลอดภัยที่ชาญฉลาดมีการเพิ่ม / เลิกใช้วิธีการเข้ารหัสหลายวิธีเนื่องจาก crypto จะก้าวไปข้างหน้า
  • มีการเปลี่ยนแปลงไฟล์ IO ( อาจเป็นลิงค์ที่ดีกว่า ) เพิ่มบางสิ่งที่เป็นนามธรรมให้ดีขึ้นในหลาย ๆ ที่ ฉันไม่ได้ดำดิ่งลงไปในสิ่งใหม่ ๆ ของ IO แต่ดูเหมือนว่าจะมีประโยชน์มากในการยกเครื่องทำให้ทำงานกับระบบไฟล์ได้ง่ายขึ้นโดยไม่เจ็บปวดมากนัก
  • การสนับสนุน Unicodeนั้นมากถึง Unicode 6.0 พร้อมด้วยการปรับปรุงความเป็นสากลอื่น ๆ
  • Java2Dที่คุณพูดถึงในคำถามของคุณได้รับการปรับปรุง รองรับฟอนต์ Linux ที่ดีขึ้นการเรนเดอร์ X11 ที่ดีกว่าบนเครื่องจักรที่ทันสมัยและการจัดการสคริปต์ของทิเบต

1
Nit pick: ในความเป็นจริงสตริงการสลับทำงาน"ราวกับว่ามันใช้String.equalsวิธีการ" (จากเอกสารที่คุณเชื่อมโยงไป) ในความเป็นจริงคอมไพเลอร์มีอิสระที่จะปรับให้เหมาะสมดังนั้นจึงString.equalsไม่ได้ใช้ ... โดยมีเงื่อนไขว่าเอฟเฟกต์สุทธิเหมือนกัน (และฉันคาดหวังว่ามันจะใช้งานได้String.hashcodeเหนือสวิตช์จำนวนหนึ่ง)
Stephen C

จริงพอ คอมไพเลอร์ส่วนใหญ่จะได้รับอนุญาตให้ทำตันของการเพิ่มประสิทธิภาพที่ไม่เปลี่ยนแปลงความหมายแม้ว่าดังนั้นก็มักจะซ้ำซ้อนจะชี้ให้เห็นสิ่งเล็ก ๆ น้อยเช่นนั้น; ฉันมีเฉพาะ. equals () ที่ระบุไว้อย่างชัดเจนว่ากรณีจะไม่ถูกเพิกเฉย อย่างไรก็ตามฉันได้อัปเดตข้อความเล็กน้อย
Billy Mailman

ไม่แนะนำให้ใช้การสลับสตริงเนื่องจากคุณสลับโดเมนที่ไม่ได้ผูกไว้ การสลับบน Enums เป็นพื้นกลางทั่วไปที่นี่คุณสามารถมีสตริงเหมือนการแสดง แต่มีความหมายเชิงความหมาย โอ้และ +1 สำหรับคำตอบทั้งหมด BTW
Martijn Verburg

ข้อดีของการใช้สตริงในคำสั่ง switch แทนค่าคงที่จำนวนเต็มมีอะไรบ้าง
จอร์โจ

3
เหตุผลทางธุรกิจเพียงอย่างเดียวในบรรดาสิ่งเหล่านั้นอาจเป็นการปรับปรุงความปลอดภัย นักวิชาการด้านเทคนิคต่างก็เป็นที่ถกเถียงกันและไม่เกี่ยวข้องมากนักสำหรับนักธุรกิจ
jwenting

8

try-with-resourcesเป็นคุณลักษณะที่ควรค่าแก่การอัพเกรดเป็น Java 7 สำหรับทั้งหมดเป็นของตัวเอง การรั่วไหลของทรัพยากร / การรั่วไหลของหน่วยความจำเป็นความเสี่ยงที่ยิ่งใหญ่ในการพัฒนา Java และ TWR ช่วยลดความเสี่ยงนั้นได้อย่างมาก

ฉันจะเพิ่มสิ่งที่เป็นนามธรรมของไฟล์NIO.2ใหม่และความสามารถแบบอะซิงโครนัสก็คุ้มค่าเช่นกันหากแอปพลิเคชันของคุณมีฟีเจอร์ File / Networking I / O


พวกเขายังลดปริมาณ PermGen ที่จำเป็นและใช้ Heap หรือหน่วยความจำดั้งเดิมแทนฉันไม่แน่ใจว่าจะเก็บไว้ที่ไหน Java 8 หมายความว่าคุณไม่จำเป็นต้องตั้งค่าพารามิเตอร์หน่วยความจำสูงสุดสองตัว
Andrew T Finnell

ไม่ลองกับทรัพยากรเหมือนทดลองในที่สุด แต่ใช้แผ่นเหล็กน้อยกว่าใช่ไหม
jhewlett

1
ฉันคิดว่าความคิดคือหม้อต้มน้ำที่น้อยกว่าทำให้ง่ายขึ้น
MatrixFrog

1
จานหม้อไอน้ำน้อยลงและ smeantics ปิดที่ถูกต้อง พวกเขาค้นพบว่าภายใน OpenJDK พวกเขาทำผิดด้วยตนเองประมาณ 2/3 ของเวลา .... ฉันสงสัยว่าเปอร์เซ็นต์ที่สูงอื่น ๆ นี้ในโค้ดของคลังข้อมูลอื่น ๆ
Martijn Verburg

6

อาจมีเหตุผลที่คุณไม่ควรเปลี่ยนเป็น Java 7: หากคุณต้องใช้ Oracle ของ VM และซอฟต์แวร์ของคุณทำงานบนฮาร์ดแวร์ที่ฝังตัวหรือคุณจะแจกจ่ายมันด้วยฮาร์ดแวร์ฝังตัว: Oracle เปลี่ยนใบอนุญาตของ JRE เพื่อไม่ได้รับอนุญาตหากด้านบน ตรงตามเงื่อนไข คุณจะต้องซื้อใบอนุญาตแบบฝังตัวของ Java SE ดู"ระบบวัตถุประสงค์ทั่วไป" หมายถึงอะไรสำหรับ Java SE Embedded?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.