2013-08-09 30 views
10

Tôi muốn để có được thông tin chi tiết về tính năng này của Java7 như mã nàyNull-an toàn Phương pháp gọi Java7

public String getPostcode(Person person) 
{ 
    if (person != null) 
    { 
     Address address = person.getAddress(); 
     if (address != null) 
     { 
      return address.getPostcode(); 
     } 
    } 
    return null; 
} 

Có thể làm một cái gì đó như thế này

public String getPostcode(Person person) 
{ 
    return person?.getAddress()?.getPostcode(); 
} 

Nhưng thẳng thắn của nó không nhiều rõ ràng với tôi .Vui lòng giải thích?

+2

Tại sao bạn cần phải viết nó trong một cách ngắn hơn? Thật dễ dàng để đọc và đơn giản trong ví dụ đầu tiên của bạn. – Kon

+1

@Kon có quyền nhưng ai sẽ không muốn viết mã nhỏ –

+1

Tôi nghĩ rằng đề xuất bị từ chối cho Java 7. Bạn có liên kết cho tài liệu chính thức không? –

Trả lời

13

Gọi phương thức an toàn không được đề xuất đã được đề xuất cho Java 7 như một phần của Dự án Coin, nhưng nó đã không làm cho nó phát hành cuối cùng.

Xem tất cả các tính năng đề xuất, và những gì tất cả cuối cùng cũng đã được lựa chọn ở đây - https://wikis.oracle.com/display/ProjectCoin/2009ProposalsTOC


Theo như đơn giản hóa phương pháp đó là có liên quan, bạn có thể làm một sự thay đổi chút ít:

public String getPostcode(Person person) { 

    if (person == null) return null; 
    Address address = person.getAddress(); 
    return address != null ? address.getPostcode() : null; 
} 

Tôi không nghĩ rằng bạn có thể nhận được bất kỳ súc tích và rõ ràng hơn này. IMHO, cố gắng hợp nhất mã đó thành một dòng, sẽ chỉ làm cho mã ít rõ ràng hơn và ít đọc được hơn.

+0

vì vậy nó chỉ để viết ngắn dòng mã? –

+0

@subodh. Ý bạn là như thế nào? –

+0

Bạn có nghĩa là tính năng này không có sẵn với java7 và chúng tôi không thể thực hiện nó chưa? –

1

Nếu tôi hiểu câu hỏi của bạn một cách chính xác và bạn muốn làm cho đoạn code ngắn hơn, bạn có thể tận dụng lợi thế của các nhà khai thác ngắn mạch bằng cách viết:

if (person != null && person.getAddress() != null) 
    return person.getAddress().getPostCode(); 

Điều kiện thứ hai sẽ không được kiểm tra nếu là người đầu tiên là sai bởi vì toán tử & & ngắn mạch logic khi gặp phải false đầu tiên.

+4

Trừ khi bạn đánh giá 'person.getAddress()' hai lần: ( – arshajii

+3

@Gamb Không, nó không phải là một câu hỏi tối ưu hóa (mặc dù điều đó cũng có thể xảy ra nếu 'getAddress()' mất một thời gian dài, nhưng có lẽ nó không Mã này không giống như mã OP. – arshajii

+0

@Gamb Nếu cơ thể 'getAddress()' liên quan đến một số lượng lớn xử lý, một cuộc gọi thứ hai sẽ là không mong muốn mà không biết cách thực hiện của phương pháp, chúng ta không thể đưa ra các giả định về chất lượng tối ưu của một cuộc gọi so với hai cuộc gọi. – Vulcan

0

Nó sẽ làm việc cho bạn:

public String getPostcode(Person person) { 
    return person != null && person.getAddress() != null ? person.getAddress().getPostcode() : null; 
} 

Ngoài ra kiểm tra chủ đề này: Avoiding != null statements

+0

@NotNull sẽ được hỗ trợ bởi Java7 –

+0

Bây giờ nó chính xác. Cảm ơn. –

Các vấn đề liên quan