Làm thế nào để biện minh cho việc di chuyển từ Java 6 sang Java 7?


28

Chúng tôi đã chuyển từ Java 6 sang Java 7 . Dự án chậm tiến độ và rủi ro bị bỏ, trong trường hợp đó, nó sẽ tiếp tục sử dụng Java 6.

Những cải tiến cụ thể trong Java 7 mà chúng ta có thể quay lại với người quản lý của mình và thuyết phục anh ta rằng điều quan trọng là sử dụng JDK 7 là gì? Tìm kiếm các bản sửa lỗi mà tôi có thể nêu bật trong Oracle Java 7 (liên quan đến Java 6). Các bản sửa lỗi về bảo mật, hiệu năng, Java 2D / in, v.v. sẽ dễ bán hơn trong trường hợp của tôi. Trình biên dịch sửa lỗi chẳng hạn, sẽ không sử dụng nhiều.

[Tôi đang xem qua nhiều trang web như hướng dẫn áp dụng Oracle , cơ sở dữ liệu lỗi, câu hỏi về Stack Overflow].

Cập nhật: Cảm ơn câu trả lời. Chúng tôi lên lịch lại bản cập nhật để phát hành tiếp theo. Gần nhất chúng tôi nhận được là an ninh. Chấp nhận câu trả lời bình chọn cao nhất.


5
Bạn thật may mắn. Đánh giá từ các câu hỏi vẫn thường xuyên xuất hiện trên Stack Overflow , một số người vẫn bị mắc kẹt với Java 1.4 (một nền tảng đã 11 tuổi!).
Joachim Sauer

3
Tại sao bạn đang thực hiện nâng cấp ngay bây giờ nếu bạn chưa biết một số tính năng trong 7 mà bạn cần? Có lẽ bạn đang lãng phí thời gian của mình và nên suy nghĩ thêm một chút về việc bạn có nên biện minh cho nó hơn là cách bạn nên biện minh cho nó.
Bryan Oakley

1
Là tôi hay là tiêu đề ngược?
Radu Murzea

1
Câu hỏi lớn hơn là: Tại sao bạn gặp khó khăn trong việc nâng cấp? Tôi đã có thể nâng cấp một triệu dự án loc trong một tuần lên Java 7. Tôi nghĩ rằng câu trả lời cho các vấn đề của bạn là phân tích lý do tại sao bạn gặp khó khăn khi thực hiện nâng cấp.
Andrew T Finnell

2
@ Andrew Finnell: Xin lỗi. Tôi không nghĩ rằng nó có liên quan. Việc chuyển thực tế đã được hoàn thành trong vòng chưa đầy một tuần. Chủ yếu là do api độc quyền của mặt trời chúng tôi sử dụng. Đó là một mã tương thích cụ thể với chức năng so với số dòng mã thực tế (khoảng 4 triệu). Sự chậm trễ gây ra là do các yếu tố khác nhau như công cụ hỗ trợ- Ví dụ, phạm vi bảo hiểm mã sử dụng cobertura 2.0. chỉ là ổn định. Một công cụ khác là Rational Functional Tester yêu cầu nâng cấp (chúng tôi đã chọn không làm). Có thể tôi sẽ viết một ghi chú về các yếu tố tổng thể ảnh hưởng đến nỗ lực ..
Jayan

Câu trả lời:


44

Java 6 đã đạt EOL vào tháng 2 năm nay và sẽ không còn nhận được các bản cập nhật công khai (bao gồm cả bảo mật) trừ khi bạn mua hỗ trợ doanh nghiệp rất tốn kém.

Đó nên là tất cả lý do cần thiết.

Ngoài ra, bằng chứng áp đảo cho thấy khả năng tương thích ngược với thời gian chạy Java là tuyệt vời. Rất có thể là bạn chỉ cần thay thế các cài đặt Java 6 bằng Java 7 và tất cả các ứng dụng sẽ tiếp tục hoạt động mà không gặp sự cố nào. Tất nhiên điều này không được đảm bảo và các thử nghiệm rộng rãi được khuyến nghị để xác nhận rằng thực sự sẽ không có vấn đề gì.


2
đó nên là một câu trả lời được chấp nhận Lý luận dựa trên ngày EOL đã được chứng minh là hoạt động tốt nhất đối với tôi bất cứ khi nào có nhu cầu biện minh cho các cập nhật sản phẩm cụ thể, đặc biệt là Java. Để hoàn thành biện minh, tôi cũng sẽ thêm ghi chú về khả năng tương thích nhị phân ngược (tốt nhất là sao lưu với một số tuyên bố chính thức của Oracle) và một lưu ý về việc cần phải kiểm tra bản cập nhật (ví dụ: một số phụ thuộc không mong muốn vào các tham chiếu được mã hóa cứng cho phiên bản " 6 "trong cấu hình ứng dụng)
gnat

1
về cơ bản đó là lý do duy nhất hầu hết các công ty sẽ nâng cấp.
jwenting

Michael, sẽ có ý nghĩa khi thêm ghi chú tôi đã đề cập ( làm rõ về khả năng tương thích và kiểm tra khói ) vào câu trả lời của bạn? vì lợi ích của sự hoàn chỉnh để nói
gnat

1
@gnat: đã xong, mặc dù tôi nghi ngờ những người chống lại việc di chuyển cần phải được thông báo về sự cần thiết phải thử nghiệm và thay vì chỉ kiểm tra khói. Chắc chắn đôi khi không tương thích nghiêm trọng.
Michael Borgwardt

@MichaelBorgwardt tốt, nói về điều đó là một điều khó khăn và nó có nhiều việc phải làm về việc hấp dẫn hơn là đúng về mặt kỹ thuật. Tôi đã học được một cách khá khó khăn để phát biểu những thứ như thế một cách rõ ràng và rõ ràng khi có những kẻ "bắt đầu thay đổi". Kiểu này gửi tín hiệu cho họ, "chúng tôi lắng nghe và chia sẻ mối quan tâm của bạn, và chúng tôi cũng lo lắng", khiến họ cảm thấy có giá trị (trái ngược với bị bỏ qua) ... và cuối cùng dẫn đến sự chấp thuận dễ dàng hơn cho sự thay đổi :)
gnat

29

Nói chung, có một số thay đổi khá rộng để làm cho mọi thứ dễ dàng hơn với lập trình viên. Người quản lý của bạn có thể không quan tâm quá nhiều đến những điều như vậy, nhưng khiến các lập trình viên mất ít thời gian hơn để suy nghĩ về mã soạn sẵn, và do đó có nhiều thời gian hơn để suy nghĩ về mục tiêu thực tế của những gì họ đang thực hiện, nên tăng hiệu quả, giảm lỗi, v.v., đó có thể là một cuộc tranh luận rất mạnh mẽ Oracle có một danh sách các thay đổi khá rộng rãi , nhưng nó khá dài, vì vậy tôi sẽ tóm tắt càng nhiều càng tốt.

Các tính năng ngôn ngữ bao gồm:

  • Ít nồi hơi trên Generics. Map<String, String> myMap = new HashMap<String, String>();có thể được giảm xuống Map<String, String> myMap = new HashMap<>(). Trình biên dịch có thể suy ra các loại Chung cần thiết ở phía bên phải từ bên trái, do đó mã của bạn sẽ ngắn hơn một chút và nhanh hơn để đọc.
  • Các chuỗi làm việc trong các câu lệnh chuyển đổi bây giờ , sử dụng ngữ nghĩa của .equals()phương thức thay vì ==.
  • Quản lý tài nguyên tự động bằng cách sử dụng thử với tài nguyên. Điều này làm cho mã sạch hơn, nhưng cũng có một lợi thế so với mã thử / cuối cùng dựa trên kiểu cũ. Nếu một ngoại lệ được đưa ra trong câu lệnh thử và sau đó một trường hợp khác được ném trong khi đóng, mã sử dụng câu lệnh thử / cuối cùng truyền thống sẽ hoàn toàn mất đi ngoại lệ ban đầu và chỉ bỏ qua câu lệnh được ném trong khối cuối cùng. Trong câu lệnh try-with-resource, bộ thực thi sẽ loại bỏ ngoại lệ mà các lệnh gọi close () đã ném và đánh bóng ngoại lệ ban đầu lên ngăn xếp, theo giả định rằng ngoại lệ ban đầu này là ngoại lệ gây ra tất cả các vấn đề trong lần đầu tiên địa điểm. Ngoài ra, thay vì từ bỏ ngoại lệ khác cho trình thu gom rác, việc triệt tiêu này cho phép các ngoại lệ ném gần được lấy ra bằng cách sử dụng Throwable.getSuppressed.
  • Chữ số có thể được làm cho dễ đọc hơn. Tất cả các chữ số đều cho phép gạch dưới , vì vậy những thứ như int n = 1000000000có thể được làm thành dễ đọc hơn nhiều int n = 1_000_000_000, dễ dàng phân tích thành một tỷ và khó nhập sai hơn mà không nhận thấy. Ngoài ra, chữ nhị phân được cho phép ở dạng 0b10110101, làm cho mã hoạt động với các trường bit dễ đọc hơn một chút.
  • Xử lý nhiều loại ngoại lệ trong cùng một câu lệnh bắt có thể được thực hiện, giảm mã trùng lặp và có khả năng giúp tái cấu trúc dễ dàng hơn sau này.

Mỗi một trong những thay đổi này là điều mà người quản lý của bạn có thể không quan tâm trực tiếp, nhưng chúng giúp việc viết mã chính xác dễ dàng hơn một chút mà không cần nhiều nỗ lực và suy nghĩ, giải phóng tâm trí của bạn để tập trung hơn một chút vào logic thực tế mà bạn đang cố gắng để thực hiện và họ cũng làm cho việc đọc mã sau này dễ dàng hơn một chút, giúp việc gỡ lỗi nhanh hơn một chút.

Về phía API, một số cập nhật API cũng đã xảy ra:

  • Bảo mật , một số phương thức mã hóa đã được thêm / không dùng nữa, vì tiền điện tử di chuyển về phía trước.
  • Tệp IO đã được thay đổi, ( tuy nhiên, đây có thể là một liên kết tốt hơn ) thêm một số trừu tượng tốt hơn ở một số nơi. Tôi đã không đích thân lao vào công cụ IO mới, nhưng có vẻ như một cuộc đại tu rất hữu ích, giúp làm việc với hệ thống tập tin dễ dàng hơn mà không quá đau đớn.
  • Hỗ trợ Unicode lên đến Unicode 6.0, cùng với một số cải tiến quốc tế hóa khác.
  • Java2D , mà bạn đã đề cập trong câu hỏi của mình, đã được cải thiện. Hỗ trợ phông chữ Linux tốt hơn, kết xuất X11 tốt hơn trên các máy hiện đại và xử lý các tập lệnh Tây Tạng.

1
Chọn Nit: Trong thực tế, chuyển đổi chuỗi hoạt động "như thể nó đang sử dụng String.equalsphương thức" (từ tài liệu bạn liên kết đến). Trong thực tế, trình biên dịch được tự do tối ưu hóa để String.equalskhông được sử dụng ... với điều kiện là hiệu ứng mạng là như nhau. (Và, tôi hy vọng rằng nó sẽ sử dụng String.hashcodetrên một số trường hợp chuyển đổi nhất định.)
Stephen C

Đúng đủ rồi. Hầu hết các trình biên dịch được phép làm một tấn của tối ưu mà không thay đổi ngữ nghĩa mặc dù, vì vậy nó thường không cần thiết để chỉ ra những điều nhỏ nhặt như thế; Tôi chỉ đề cập cụ thể .equals () để nói rõ rằng trường hợp đó không được bỏ qua. Tuy nhiên, tôi đã cập nhật từ ngữ một chút.
Billy Mailman

Chuyển đổi chuỗi không được khuyến nghị thực hành vì bạn chuyển sang một miền không liên kết. Bật Enums là một nền tảng trung gian điển hình ở đây vì bạn có thể có Chuỗi giống như biểu diễn, nhưng với ý nghĩa ngữ nghĩa. Oh và +1 cho câu trả lời hoàn chỉnh BTW.
Martijn Verburg

Những lợi thế của việc sử dụng chuỗi trong câu lệnh chuyển đổi thay vì hằng số nguyên là gì?
Giorgio

3
lý do kinh doanh duy nhất trong số đó có thể là các cải tiến bảo mật. Kỹ thuật tốt đẹp là cả tranh cãi và hoàn toàn không liên quan cho người kinh doanh.
jwenting

8

dùng thử với tài nguyên là một tính năng đáng để nâng cấp lên Java 7, tất cả đều là của riêng nó. Rò rỉ tài nguyên / rò rỉ bộ nhớ là một rủi ro lớn trong phát triển Java và TWR làm giảm đáng kể rủi ro đó.

Tôi sẽ thêm tính năng trừu tượng hóa tệp NIO.2 mới và khả năng không đồng bộ cũng đáng để chuyển sang nếu ứng dụng của bạn có các tính năng I / O tệp / mạng.


Họ cũng đang giảm lượng PermGen cần thiết và sử dụng Heap hoặc bộ nhớ riêng thay vào đó, tôi không chắc chắn nơi nó sẽ được lưu trữ ngay bây giờ. Điều này có nghĩa là bởi Java 8, bạn sẽ không cần đặt hai tham số bộ nhớ tối đa.
Andrew T Finnell

Không phải là dùng thử với các tài nguyên giống như thử cuối cùng nhưng với ít nồi hơi hơn?
jhewlett

1
Tôi nghĩ ý tưởng là ít nồi hơi hơn có nghĩa là dễ dàng hơn để làm đúng.
MatrixFrog

1
Ít nồi hơi và đóng cửa chính xác. Họ phát hiện ra rằng bên trong OpenJDK họ đã làm điều đó bằng tay sai khoảng 2/3 thời gian .... Tôi nghi ngờ tỷ lệ phần trăm cao này trong các kho mã khác.
Martijn Verburg

6

Có thể có một lý do tại sao bạn không nên chuyển sang Java 7: Nếu bạn phải sử dụng VM của Oracle và phần mềm của bạn chạy trên phần cứng nhúng hoặc bạn sẽ phân phối nó với phần cứng nhúng: Oracle đã thay đổi giấy phép của JRE để nó không được cấp phép nếu ở trên Các điều kiện được đáp ứng; bạn sẽ cần mua giấy phép nhúng Java SE. Xem "Hệ thống mục đích chung" có nghĩa gì đối với Java SE Embedded?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.