2012-08-01 21 views
17

Một vấn đề với việc sử dụng ổi của Optional loại như các đối số của phương pháp là bạn không thể chỉ đơn giản là viếtĐi qua Optional.absent() đánh giá cao với các phương pháp xác

// method declaration 
public void foo(Optional<String> arg); 

// compiler error 
foo(Optional.absent()); 

do suy luận kiểu thất bại, nhưng thay vì phải thêm nhập rõ ràng:

// real method call 
foo(Optional.<String> absent()); 

Làm cách nào để tránh?

+6

Không thực sự tốt hơn, nhưng FYI, 'Tùy chọn' có xu hướng được sử dụng phổ biến hơn làm giá trị trả về so với loại đối số phương thức. (Nó dễ dàng hơn nhiều để quên rằng một giá trị trả về từ một phương thức có thể là null so với một đối số cho phương thức bạn đang viết.) –

+0

Với biểu thức phức tạp, tôi sử dụng biến cục bộ của một kiểu thích hợp (trên RHS của bài tập không có biến kiểu nào là cần thiết) để có được một cái gì đó dễ đọc hơn. Nhưng ở đây không có gì có thể được thực hiện cho đến khi độ phân giải đến (có lẽ là JDK8). – maaartinus

+3

@LouisWasserman Vẫn có những lợi ích khi sử dụng 'Tùy chọn' làm đối số: 1) làm rõ cho người dùng API rằng một đối số có thể không có mặt; 2) giúp bạn dễ dàng chuyển giá trị trả về của phương thức khác cho phương thức của bạn. –

Trả lời

-4

Chỉ khi viết câu hỏi, tôi nghĩ có

public class GuavaConstants { 
    @SuppressWarnings({ "raw" }) 
    public static final Optional ABSENT = Optional.absent(); 

    // similar for empty ImmutableList, etc. 
} 

và sau đó là cuộc gọi có thể trông giống như

@SuppressWarnings({ "unchecked" }) 
foo(GuavaConstants.ABSENT); 

Có một cách tiếp cận tốt hơn?

+16

Có, 'foo (Tùy chọn. vắng mặt())' là tốt hơn. Điều này không đánh tôi như một cái gì đó bạn nên làm gì cả. – ColinD

+3

@ColinD, vui lòng đăng bài này làm câu trả lời, tôi cho một người sẽ upvote nó ngay lập tức. Câu trả lời được chấp nhận (và chỉ) là khá khó chịu. –

7

Nếu bạn đang đối phó với một nhóm nhỏ các Optional<> loại (ví dụ, chủ yếu là chuỗi hoặc một số ít các loại khác), chỉ cần tạo một số phương pháp helper mà ràng buộc đối số kiểu cho bạn:

public final class AbsentValues { 
    public static Optional<String> absentString() { 
     return Optional.<String>absent(); 
    } 
} 

Bạn có thể thậm chí nhập các mã này tĩnh để dẫn đến mã sạch hơn:

import static AbsentValues.*; 

... 

foo(absentString()); 

Đối với loại ít phổ biến hơn Optional<>, chỉ cần xác định loại đối số một cách rõ ràng. Nó có thể không được đẹp, nhưng nó là chính xác.

-1

Vì vậy, đây là cách phù hợp để thực hiện việc này. Nếu không cho bất cứ điều gì khác, hãy để tôi ít nhất hiển thị nó ở đây để tham khảo trong tương lai của riêng tôi, cho tất cả những người không đọc câu hỏi, như bản thân mình :) Cảm ơn ColinD (và Alexey).

foo(Optional.<String>absent()) 
Các vấn đề liên quan