2013-04-12 26 views
20

Có cách nào để thực hiện thao tác ternary java mà không thực hiện nhiệm vụ hoặc cách giả mạo sự phân tích không?Java Ternary không có bài tập

Tôi thích mã ternary ngắn gọn trông như thế nào khi thực hiện một nhóm if/then/elses.

Tôi hy vọng có thể gọi một trong hai hàm trống dựa trên tuyên bố đại số boolean.

Cái gì như:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

chức năng của tôi là trở lại loại void, vì vậy nếu có một cách để giả mạo này trong một bài tập để làm cho nó hoạt động, sau đó tôi "m ý với điều đó .. . tôi muốn xem làm thế nào để làm điều đó mặc dù :)

+0

@VenomFangs bạn có thể thay đổi hàm của mình để trả về giá trị không đổi luôn và gán giá trị trả về này cho biến giả. Nhưng nó không có giá trị phức tạp - mã sẽ trông ngu ngốc, tôi sợ. Tốt hơn để làm điều đó như bạn đã biết bạn nên làm. –

Trả lời

17

Không, bạn không thể làm điều đó. spec says so.

Toán tử điều kiện có ba biểu thức toán hạng. ? xuất hiện giữa các biểu thức thứ nhất và thứ hai, và: xuất hiện giữa các biểu thức thứ hai và thứ ba là .

Biểu thức đầu tiên phải thuộc loại boolean hoặc Boolean hoặc xảy ra lỗi biên dịch .

Đó là một lỗi thời gian biên dịch cho một trong hai thứ hai hoặc thứ ba toán hạng biểu hiện là một lời khẩn cầu một khoảng trống phương pháp .

[EDIT]

Vì bạn được hỏi về phản ánh, đây là một giải pháp. Tôi không đề xuất điều này. Tôi chỉ đăng nó vì bạn đã hỏi.

public class MyCall 
{ 

    public void a(){System.out.println("a");} 
    public void b(){System.out.println("b");} 

    public static void main(String... args) 
    { 
     new MyCall().go(); 
    } 

    public void go() 
    { 
     Class<? extends MyCall> class1 = this.getClass(); 
     Method aMethod = class1.getMethod("b", null); 
     Method bMethod = class1.getMethod("a", null); 
     Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null); 
     Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null); 
    } 
} 

Vào cuối ngày, bạn phải tự hỏi mình nếu không đủ cải thiện khả năng đọc mã của bạn (suy nghĩ cho mỗi vòng lặp). Không có giải pháp nào trong số những giải pháp này cải thiện khả năng đọc mã của IMHO. Nếu tôi là bạn tôi muốn đi với điều này.

if(condition) 
    a(); 
else 
    b(); 

Tôi thực sự cho bao gồm niềng răng ngay cả khi vòng chỉ chứa một dòng duy nhất, nhưng kể từ khi bạn đang đi sau khi mã sắc nét, đoạn trên nên làm.

+0

Bất kỳ suy nghĩ về bình luận phản ánh trong: http://stackoverflow.com/questions/4830843/in-java-is-it-possible-to-cast-to-void -Không có void –

+0

Có cách nào để làm cho void phản ánh null sau đó gán null cho một đối tượng? –

+2

Đã chỉnh sửa câu trả lời của tôi bằng giải pháp phản chiếu. Đối với mục đích học tập của khóa học :) –

8

không, bạn không thể làm điều này như thế này.

bạn có thể thích phong cách này nếu không thích làm cho nó nhiều câu lệnh.

if(bool1 && bool2) voidFunc1(); else voidFunc2(); 

Trong toán tử bậc ba, Toán tử được yêu cầu phải là biểu thức không trống; tức là họ phải sản xuất một số giá trị thực tế.

+0

Tôi thích bài thuyết trình này ... Tôi sẽ chấp nhận câu trả lời này nếu không ai khác có thể chỉ cho tôi một cách để làm điều đó. Ví dụ. Bởi sự phản ánh của void để null ... vv –

1

Nếu bạn thực sự thực sự muốn sử dụng hoạt động ternany, thì có một lần hack. NHƯNG đây là mã rất xấu, chỉ dành cho khả năng hiển thị ngôn ngữ. Tôi sẽ không bao giờ khuyên bạn nên đặt mã này vào sản xuất hoặc thậm chí hiển thị cho bạn bè của bạn.

int dummy = (bool1 && bool2) ? new Object(){ 
     public int hashCode() { 
      yourFunction1(); 
      // ... 
      yourFunctionN(); 
      return 0; 
     }; 
    }.hashCode() : new Object(){ 
     public int hashCode() { 
      yourAnotherFunction1(); 
      // ... 
      yourAnotherFunctionN(); 
      return 0; 
     }; 
    }.hashCode(); 
1

Có cách nào để làm một hoạt động ternary java mà không làm một bài tập hoặc cách để giả mạo việc chuyển nhượng?

OK, vì vậy khi bạn viết một tuyên bố như thế này:

(bool1 && bool2) ? voidFunc1() : voidFunc2(); 

có hai vấn đề riêng biệt với các mã:

  1. The 2nd và toán hạng thứ 3 của một biểu thức điều kiện không thể gọi để hủy các phương thức. Tham chiếu: JLS 15.25.

  2. Biểu thức không phải là câu lệnh, trừ khi biểu thức đó hoặc biểu thức gán hoặc HOẶC gọi phương thức HOẶC tạo đối tượng. Tham chiếu: JLS 14.8.

Trong thực tế, thứ hai của những vấn đề này là một cú pháp lỗi và tôi mong chờ bất kỳ trình biên dịch Java chính để báo cáo thay vì vấn đề đầu tiên. Vấn đề đầu tiên sẽ chỉ tiết lộ bản thân nếu bạn đã làm một cái gì đó như thế này:

SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2(); 

hoặc

gobble((bool1 && bool2) ? voidFunc1() : voidFunc2()); 

nơi gobble là một phương pháp mà không làm gì ... ngoại trừ "tiêu thụ" giá trị của đối số của nó.

AFAIK, không có ngữ cảnh nào trong đó biểu thức ban đầu được chấp nhận.


1 - "Cụm từ điều kiện" là thuật ngữ chính được sử dụng cho cấu trúc này trong Đặc tả ngôn ngữ Java. Nó được gọi là "toán tử điều kiện bậc ba" trong Oracle Java Tutorial.