Giúp tôi bắt kịp những gì tôi đã bỏ lỡ kể từ Java 1.4.2 [đã đóng]


14

Tôi sắp bắt đầu vị trí nghề nghiệp chuyên nghiệp đầu tiên của mình với tư cách là nhà phát triển phần mềm và có khả năng tôi sẽ viết rất nhiều mã Java. Tôi không biết nhiều về những gì cụ thể tôi sẽ viết, và bên cạnh đó, tôi có những sở thích khá rộng khi nói đến mã.

Vì những lý do không đáng bàn, lần thực tập cuối cùng của tôi chỉ cho tôi viết mã cho Java 1.3 và 1.4 SDK. Ngoài ra, giáo dục đại học của tôi đã tập trung chủ yếu vào các thuật toán, cấu trúc dữ liệu và lý thuyết khác, không phải các tính năng ngôn ngữ hoặc thư viện.

Vì vậy, với ý nghĩ trên, các tính năng, lớp, v.v. trong phiên bản Java hiện tại (chúng ta đang ở số nào bây giờ?) Sẽ đáng để tôi đọc lên và tại sao? Tôi đã bỏ lỡ điều gì từ 1.4.2 khiến cuộc sống lập trình viên của bạn dễ dàng hơn?

Các ví dụ và câu chuyện về cách bạn phát hiện ra một gói cụ thể hoặc một số như vậy và đưa nó vào sử dụng cũng sẽ rất tuyệt.


4
Những lý do này không đáng để thảo luận là gì? Nhiều người trong chúng ta tò mò ...
5arx 6/12/2016

@ 5arx Vâng, tôi đã làm việc với phiên bản 1.4 của java cho Lập trình Robot vì một số lý do đó là những gì nền tảng của chúng tôi hỗ trợ.
Daniel Gratzer

Câu trả lời:


15

Những thay đổi mà tôi cho là quan trọng nhất là:

  • Generics (ví dụ: bộ sưu tập đã nhập, như Set)

  • Vòng lặp nâng cao (for (Chuỗi s: set) {...})

  • Autoboxing / unboxing (tự động chuyển đổi giữa các loại như Integer thành int và ngược lại)

  • Enums Formsafe (enum hiện là một từ khóa, các loại có thể được tạo ra từ enum)

  • Varargs (cho hàm printf (), cho phép số lượng đối số thay đổi)

  • Nhập tĩnh (hiện có thể nhập các phương thức tĩnh của một lớp, chẳng hạn như java.lang.Math)

  • Chú thích

  • java.util.conc hiện (Thể hiện sự tương tranh của java)

Cũng đọc Java mà bạn đang hướng tới là gì? , để hiểu rõ hơn về ba phiên bản.


1
++ tăng cường cho vòng lặp, autoboxing / unboxing, varargs, static import rất đơn giản
Michael Wiles

Tại sao các lập trình viên Java gọi cho mỗi vòng lặp "được tăng cường for vòng lặp ?"
Tối đa

2
@Maxpm Bởi vì đó là cách nó được gọi trong Đặc tả ngôn ngữ Java. Theo JLS, có các vòng lặp cơ bản và tăng cường cho các vòng lặp. Tôi không chắc tại sao họ quyết định làm theo cách đó. Có thể do cú pháp không sử dụng một từ khóa đặc biệt và loại hỗn hợp với các vòng lặp thông thường.
Malcolm

10

Sự thay đổi quan trọng nhất trong cuộc sống lập trình hàng ngày của bạn là việc giới thiệu các khái quát có thể sẽ được sử dụng trong mọi mô-đun mới mà bạn sẽ được yêu cầu viết và đó là một cú pháp mới khó hiểu.

Generics là cơ chế cho phép ví dụ a Listchứa chuỗi thay vì đối tượng trần, trong đó trình biên dịch thực thi rằng một mục được đưa vào danh sách là Chuỗi và nó biết rằng khi bạn lấy một mục ra khỏi danh sách thì đó là Chuỗi .

Điều này làm cho các chương trình tốt hơn khi bạn tránh được thời gian chạy rõ ràng được chuyển sang loại mục tiêu (vốn là lỗi thường xuyên xảy ra nếu bạn hiểu sai) và IDE có thể giúp bạn thực hiện tất cả các công việc bẩn thỉu vì nó biết nhiều về mã của bạn hơn nó đã làm khi nó chỉ là danh sách các đối tượng.

Joshua Bloch đã viết một bài giới thiệu hay về Generics, có sẵn như chương mẫu tại http://java.sun.com/docs/books/effective/


Xin đừng nói với người Groovy! "Điều này làm cho các chương trình tốt hơn khi bạn tránh thời gian chạy chuyển sang loại mục tiêu." def whatever....
Dan Rosenstark

@Yar, chỉnh sửa để rõ ràng hơn. Tôi sẽ yêu thuộc tính "def" hoặc "var". Sẽ làm cho cuộc sống của tôi dễ dàng hơn một chút.

Vâng, tôi mới chỉ nghĩ điều này gần đây với Objective-C và idđó là defhoặc var.... nhưng sau đó, một lần nữa, sự an toàn của việc gõ tĩnh 100% thật đáng kinh ngạc, thực sự.
Dan Rosenstark

@Yar: Bạn sẽ thích Ada :)
mattnz

@mattnz tại sao, đặc biệt? Và trong khi chúng ta ở đây, nó có chạy trên JVM không?
Dan Rosenstark

6

Autoboxing là một tính năng hay được giới thiệu với Java 5. Giống như trong C #, trình biên dịch hiện thực hiện chuyển đổi tự động giữa các kiểu nguyên thủy (cơ bản) và các lớp trình bao bọc đối tượng tương ứng của chúng (int thành Integer, v.v.) và quay lại. Điều đó làm cho việc làm việc với Bộ sưu tập Java bớt đau hơn nhiều.

Đối với - mỗi vòng lặp cũng mới trong Java 5, tôi nghĩ vậy. Nó làm cho việc lặp lại qua các mảng (và các bộ sưu tập) dễ dàng hơn, bởi vì nó loại bỏ phần lớn sự lộn xộn thông thường liên quan đến việc thiết lập và quản lý một biến chỉ mục hoặc các trình lặp. Ví dụ:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Enums , để thay thế các thống kê và hằng số cuối cùng và giúp bạn loại bỏ các tham chiếu đến chuỗi và số ma thuật. Một ví dụ được lấy từ những người tốt ở mặt trời / nhà tiên tri :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.conc hiện được giới thiệu trong 1.5. Tài nguyên tốt nhất để học nó là (có lẽ) cuốn sách Đồng thời Java trong Thực hành . Đồng thời IMHO là lợi thế cạnh tranh quan trọng nhất của Java so với bất kỳ điều gì khác vì vậy nó chắc chắn đáng để biết rõ.


1
+1 Để đề cập đến gói đồng thời. Thật đáng buồn khi rất nhiều nhà phát triển vẫn sử dụng các nguyên hàm đồng thời như Chủ đề, chờ () / thông báo () và đồng bộ hóa, ...
Oliver Weiler

Thật. java.util.concurrentđể nguyên thủy đồng thời giống như quản lý bộ nhớ tự động để quản lý bộ nhớ thủ công. Sử dụng cái sau chỉ là một công thức để dành nhiều thời gian hơn cho việc gỡ lỗi và không mang lại lợi ích gì.
Joonas Pulakka

Nhân viên cứu hộ! Thậm chí tốt hơn trong Java 6

+1000 nếu tôi có thể - cuốn sách đó thật tuyệt vời
Gary Rowe

4

Vâng, StringBuilderđã giúp tôi tăng tốc chương trình của tôi. Nó là một tương đương với StringBufferkhông có chủ đề an toàn.


Vâng. Java hiệu quả tuyên bố rằng StringBuffer đã lỗi thời và cần được thay thế bởi StringBuilder.
Gary Rowe

1
Việc kết hợp với +các chuỗi tự động sử dụng StringBuilder thay vì StringBuffer cho cấp nguồn 1.5 trở lên.

4

Tôi sẽ giúp bằng cách phân loại câu trả lời hữu ích từ @ykombinator. Danh sách của anh ấy là một danh sách các yếu tố mà bạn sẽ sử dụng hàng ngày trong khi thực hiện phát triển java "chung".

Tác động thấp và độ khó thấp:

  • Vòng lặp nâng cao (for (Chuỗi s: set) {...})
  • Autoboxing / unboxing (tự động chuyển đổi giữa các loại như Integer thành int và ngược lại)
  • Varargs (cho hàm printf (), cho phép số lượng đối số thay đổi)
  • Nhập tĩnh (hiện có thể nhập các phương thức tĩnh của một lớp, chẳng hạn như java.lang.Math)

Tác động cao và độ khó trung bình:

  • Enums Formsafe (enum hiện là một từ khóa, các loại có thể được tạo ra từ enum)

Tác động cao và độ khó cao:

  • Chú thích
  • Generics

Tác động thấp và độ khó cao (sẽ chỉ sử dụng trừ khi bạn thực hiện phân luồng nâng cao)

  • java.util.conc hiện (Thể hiện sự tương tranh của java)

Do đó, tôi sẽ đề nghị bạn đọc qua các tài liệu / trợ giúp về các tác phẩm khó có tác động thấp - chúng rất dễ nhận. Dành thời gian lo lắng cho Chú thích và Generics - chú thích rất hữu ích và thuốc generic có thể trở nên khá phức tạp.

Chỉ nhìn vào nội dung đồng thời mới nếu bạn cần thực hiện phân luồng.


4

Vì tôi không thể nhận xét vì tôi dưới 50 tuổi nên tôi sẽ để lại câu trả lời. Nó đã được đề cập nhưng tôi sẽ nhắc lại lần nữa: Chú thích! Loại siêu dữ liệu này đã trở thành thứ quan trọng nhất trong những năm kinh nghiệm Java của tôi. Nó được sử dụng tốt như một số khung làm nó làm cho mã ngắn gọn và rõ ràng hơn nhiều. Ví dụ: chú thích có thể:

  • Chuyển đổi một đối tượng thành một thực thể @Entity
  • Chuyển đổi một phương thức thành một dịch vụ REST @GET
  • Giải thích rằng một phương thức sẽ không bao giờ trả về null @nonnull
  • Đặt một đối tượng cho một trường để tiêm phụ thuộc @inject

Và tất nhiên bạn có thể xây dựng các chú thích của riêng mình và biết nếu một phương thức, lớp hoặc trường được chú thích bằng cách sử dụng sự phản chiếu.


2
Để được chú thích chính xác không thể thực hiện những điều này, vì chúng chỉ cần đưa thông tin meta vào mã, mà mã khác - thường là một trình nạp lớp đặc biệt - có thể thực hiện hành động. Tôi coi chú thích là một giải pháp chung rất tốt cho rất nhiều vấn đề.

3

Học bằng ví dụ làm việc cho tôi

Dưới đây là một ví dụ nhanh về Java 6 thành ngữ

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Đừng bận tâm với Java5, nó không được dùng cho Java6.

Bước tiếp theo, chú thích. Chúng chỉ xác định các khía cạnh cho mã của bạn cho phép người đọc chú thích điền vào cấu hình soạn sẵn cho bạn. Hãy xem xét một dịch vụ web đơn giản sử dụng đặc tả JAX-RS (nó hiểu các URI RESTful). Bạn không muốn làm phiền tất cả các WSDL khó chịu và lẩm bẩm với Axis2, v.v., bạn muốn có một kết quả nhanh chóng. Phải, làm điều này:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

Bang. Với một chút rắc ma thuật cấu hình trong tệp webDB của bạn, bạn sẽ tắt. Nếu bạn đang xây dựng với Maven và đã cài đặt plugin Jetty, dự án của bạn sẽ có máy chủ web nhỏ của riêng bạn ngay lập tức (không lo lắng về JBoss hoặc Tomcat cho bạn) và đoạn mã trên sẽ phản hồi URI của hình thức:

GET http://localhost:8080/contextName/Service/the/raw/path/params

Công việc hoàn thành.


3

Wow đó là một vụ nổ từ quá khứ! Tôi đã không sử dụng Java được 4 năm rồi - và không có gì thay đổi cả!

Có một danh sách các tính năng theo phiên bản , nhưng đây là bit quan trọng (tất nhiên là đạo văn) ...

J2SE 5.0 (ngày 30 tháng 9 năm 2004)

  • Generics: Cung cấp an toàn loại thời gian biên dịch (tĩnh) cho các bộ sưu tập và loại bỏ sự cần thiết của hầu hết các dự báo (chuyển đổi loại).
  • Siêu dữ liệu: Còn được gọi là chú thích; cho phép các cấu trúc ngôn ngữ như các lớp và phương thức được gắn thẻ với dữ liệu bổ sung, sau đó có thể được xử lý bởi các tiện ích nhận biết siêu dữ liệu.
  • Autoboxing / unboxing: Tự động chuyển đổi giữa các loại nguyên thủy (như int) và các lớp trình bao bọc nguyên thủy (như Integer).
  • Bảng liệt kê: Từ khóa enum tạo ra một loại an toàn, danh sách các giá trị (như Day.MONDAY, Day.TUESDAY, v.v.). Trước đây, điều này chỉ có thể đạt được bằng các số nguyên hằng không an toàn hoặc các lớp được xây dựng thủ công (mẫu enum an toàn).
  • Swing: Giao diện và cảm giác da mới, được gọi là synth.
  • Varargs: Tham số cuối cùng của một phương thức hiện có thể được khai báo bằng cách sử dụng tên loại theo sau là ba dấu chấm (ví dụ void drawtext (Chuỗi ... dòng)). Trong mã gọi, bất kỳ số lượng tham số nào của loại đó có thể được sử dụng và sau đó chúng được đặt trong một mảng được truyền cho phương thức, hoặc cách khác, mã gọi có thể truyền một mảng của loại đó.
  • Tăng cường cho mỗi vòng lặp: Cú pháp vòng lặp for được mở rộng với cú pháp đặc biệt để lặp qua từng thành viên của một mảng hoặc bất kỳ Iterable nào, chẳng hạn như các lớp Collection tiêu chuẩn, sử dụng cấu trúc của biểu mẫu:

Java SE 6 (ngày 11 tháng 12 năm 2006)

  • Hỗ trợ cho các phiên bản Win9x cũ hơn bị bỏ. Không chính thức Java 6 Update 7 là bản phát hành cuối cùng của Java được hiển thị để hoạt động trên các phiên bản Windows này. Điều này được cho là do những thay đổi lớn trong Bản cập nhật 10.
  • Hỗ trợ ngôn ngữ tập lệnh: API chung để tích hợp chặt chẽ với các ngôn ngữ tập lệnh và tích hợp Mozilla JavaScript Rhino tích hợp
  • Cải thiện hiệu suất ấn tượng cho nền tảng cốt lõi và Swing.
  • Hỗ trợ dịch vụ web được cải thiện thông qua JAX-WS
  • Hỗ trợ JDBC 4.0.
  • API Trình biên dịch Java API cho phép chương trình Java chọn và gọi Trình biên dịch Java theo chương trình.
  • Nâng cấp JAXB lên phiên bản 2.0: Bao gồm tích hợp trình phân tích cú pháp StAX.
  • Hỗ trợ cho các chú thích cắm
  • Nhiều cải tiến GUI, chẳng hạn như tích hợp SwingWorker trong API, sắp xếp và lọc bảng và đệm đôi Swing thực sự (loại bỏ hiệu ứng vùng xám).
  • Các cải tiến của JVM bao gồm: tối ưu hóa hiệu suất đồng bộ hóa và trình biên dịch, các thuật toán mới và nâng cấp lên các thuật toán thu gom rác hiện có và hiệu suất khởi động ứng dụng.

Đó là về nó. Java SE 7.0 trông thú vị hơn nhưng chưa được phát hành.

Xem xét có bao nhiêu tính năng ngôn ngữ và API mới đã được thêm vào C # trong 4 năm qua, tôi khá ngạc nhiên. Chuyện gì đang xảy ra ở Sun / Oracle?


Sun quyết định mở Java nguồn mở. Đây là những điều mà đã đảm bảo rằng bất kể những gì Oracle quyết định làm chúng ta vẫn có thể chạy OpenJDK trên hộp Linux. Điều đó chỉ khiến họ trì hoãn 18-24 tháng ...

@ Thorbjørn - điều đó có thể giải thích nó. Thật xấu hổ khi sự gián đoạn này đã gây ra bao nhiêu sự gián đoạn. Tôi đoán C # thích sự ổn định so sánh: chúng tôi đã có lambdas từ năm 2006 - nơi mà dường như họ sẽ không vào Java cho đến năm 2012 bây giờ.
sheikhjabootie
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.