2010-07-13 20 views
11

thể trùng lặp:
How are Java interfaces actually used?Có điểm nào thực sự đối với giao diện Java không?

Tôi không nói từ một điểm từ thông dụng accademic của xem nhưng từ một điểm phát triển thiết thực của quan điểm.

Vì vậy, lấy ví dụ: -

Class1 implements Interface 
public String methodOne() { 
    return "This is Class1.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class1.methodTwo()"; 
} 
    } 
Class2: 

    Class2 implements Interface 
public String methodOne() { 
    return "This is Class2.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class2.methodTwo()"; 
} 
    } 

Sử dụng giao diện: -

Client { 
    Interface intface = new Class1(); 

    intface.methodOne(); 
    intface.methodTwo(); 

    Interface intface = new Class2(); 
    intface.methodOne(); 
    intface.methodTwo(); 
} 

Nhưng những lợi ích trên chỉ writting là gì: -

Client { 
Class1 clas1 = new Class1(); 

clas1.methodOne(); 
clas1.methodTwo(); 

Class2 clas2 = new Class2(); 
clas2.methodOne(); 
clas2.methodTwo(); 
} 

Và bỏ qua các giao diện hoàn toàn.

Giao diện dường như là một lớp mã bổ sung vì lợi ích của một lớp mã bổ sung, hoặc có nhiều hơn cho chúng chứ không chỉ "Đây là các phương thức mà lớp bạn đang truy cập có"?

+2

http://stackoverflow.com/questions/504904/how-are-java-interfaces-actually-used – skaffman

Trả lời

17

Khi sử dụng các lớp độc lập, bạn không cần giao diện. Tuy nhiên, khi bạn có một hệ thống phân cấp loại , các giao diện thực sự là không thể thiếu.

Ví dụ đơn giản của bạn không thực sự làm công lý, nhưng hãy đổi tên giao diện của bạn thành một cái gì đó hữu ích và cụ thể hơn, ví dụ: Thuật toán Sorter có thể lấy danh sách các mục và sắp xếp chúng. Bạn có thể có nhiều thuật toán sắp xếp khác nhau được triển khai và bạn có thể thay đổi thuật toán được sử dụng, dựa trên ngữ cảnh (tức là QuickSort nhanh hơn cho các tập dữ liệu lớn, nhưng BubbleSort tốt hơn cho các tập dữ liệu nhỏ, v.v.) muốn gắn mã máy khách với một thuật toán cụ thể. Bằng cách sử dụng loại đa hình Sorter (được thực hiện như một giao diện), bạn có thể chuyển các đối tượng sắp xếp cụ thể khác nhau cho máy khách mà không cần biết (và quan tâm) thuật toán nào thực sự đang sử dụng. Và bạn có thể giới thiệu một thuật toán sắp xếp tốt hơn hoặc loại bỏ thuật toán không hiệu quả, mà không cần khách hàng chú ý đến bất kỳ thứ gì.

Một kỳ tích như vậy sẽ là không thể nếu không có giao diện. Phương án thay thế sẽ gọi phương thức sắp xếp trực tiếp từ (có thể trùng lặp) nếu người khác hoặc chuyển đổi tất cả các địa điểm, với khả năng không thể tránh khỏi khi giới thiệu lỗi khi quên cập nhật tất cả các địa điểm đúng khi thuật toán sắp xếp được thêm/xóa. .. chưa kể rằng bạn sẽ cần phải biên dịch lại tất cả mã máy khách sau mỗi thay đổi như vậy :-(

+0

ví dụ nhanh sẽ thực sự hữu ích! câu trả lời hay! – jacoballenwood

6

Giả sử bạn muốn có một bộ sưu tập các đối tượng có cả hai phương pháp "Method1" và "Method2" Và bạn không muốn để lập trình kiểm tra từng trường hợp trong bộ sưu tập cho loại của nó
Một bộ sưu tập các đối tượng thực hiện mà giao diện giúp bạn tiết kiệm được việc này. ul.

-1

Hãy xem xét phương pháp sau đây nhận danh sách 'intfaces', bạn không cần phải biết nếu bạn xử lý clas1 hoặc clas2, bạn chỉ muốn xử lý thứ gì đó 'là' intface. Bạn có thể thêm clas3 thực hiện intface sau này và nó sẽ stil làm việc ...

public void callMethods(List<intface> intfaces){ 
    for(Interface intface : intfaces) { 
     intface.methodOne(); 
     intface.methodTwo(); 
    } 
    } 
0

Giao diện hữu ích nếu có cơ hội bạn cần nhiều triển khai, có thể cho một công nghệ khác (cơ sở dữ liệu khác) hoặc để thử nghiệm.

0

Giao diện xác định hợp đồng loại, không có chi tiết triển khai anu. Điều này cho phép bạn lập trình chống lại giao diện mà không biết lớp thực hiện thực tế.

Một ví dụ về lợi thế của giao diện sử dụng mã của bạn có thể là:

public void useInterface(Interface obj) { 
    obj.methodOne(); 
    obj.methodTwo(); 
} 

và gọi nó như trong:

useInterface(new Class1()); 
    useInterface(new Class2()); 

Các lớp bộ sưu tập Java sử dụng rất nhiều các giao diện, nó cho phép bạn để chuyển đổi các triển khai cho các danh sách và bản đồ sau mà không phải thay đổi mã bằng các cá thể đó.

1

Những người khác có khá nhiều câu hỏi của bạn nhưng, trong một từ: Có!

Ngôn ngữ Java đã thực sự được hình thành như một ngôn ngữ hướng đối tượng khá tối thiểu và các giao diện đã có ngay từ đầu. Có các khái niệm mô tả mối quan hệ giữa các lớp khó hoặc không thể thực hiện mà không có một trong hai giao diện hoặc một số kiểu nhận dạng kiểu thời gian chạy có hiệu suất. Tất cả hoặc gần như tất cả các mẫu được trích dẫn trong sách nổi tiếng Design Patterns (dưới đây là book itself) dựa trên giao diện.

+0

Cuốn sách GoF không dựa trên các giao diện rõ ràng như cấu trúc giao diện Javas' nhưng trên các lớp thừa kế và trừu tượng. – deamon

+0

Khi thực hiện các mẫu trong Java, bạn không có lựa chọn nào ngoài việc sử dụng giao diện thay vì các lớp trừu tượng, vì bạn không thể kế thừa từ nhiều lớp. –

1

(Không chắc thế nào tôi đáp ứng mà không có nó được xem như là một câu trả lời nhưng ...)

Wow, rất nhiều câu trả lời một cách nhanh chóng, khá ấn tượng chuyên mục - chúc mừng! :-D

Vì vậy, sẽ là hợp lý nếu nói rằng Giao diện cơ bản đặt 'quy tắc' mà các lớp cụ thể phải đáp ứng?

Ví dụ: nếu tôi có các lớp Class1 & Class2, cả hai đều có phương thức 'getList()'. Nếu không thực hiện một giao diện Class1.getList() có thể trở lại nói một danh sách các chuỗi và Class2.getList() có thể trả về số nguyên. Về cơ bản, Giao diện thiết lập các quy tắc mà Lớp của tôi phải có phương thức getList() và phương thức đó phải trả về Danh sách, vì vậy nếu cả hai triển khai Danh sách Giao diện với phương thức 'public String getList();' Tôi biết rằng cả Class1 & Class2 getList() trả về một Danh sách các loại Chuỗi.

Nhưng Class1 cụ thể có thể trả về danh sách các phòng ban trong khi Class2 là danh sách nhân viên, nhưng tôi biết cả hai đều trả về danh sách các chuỗi. Điều này có lẽ sẽ trở nên hữu ích hơn nếu tôi có thể có một nửa tá hoặc hơn mỗi lớp với một nửa tá phương pháp mà tôi muốn đảm bảo đáp ứng .getList trả về một danh sách kiểu String 'rule'.

+1

để trả lời mà không có câu trả lời, bạn có thể viết nhận xét;) "Triển khai giao diện không phải là triển khai". Điều này cho phép bạn thay đổi triển khai trong khi đảm bảo rằng ứng dụng của bạn hoặc các ứng dụng khác tùy thuộc vào ứng dụng của bạn, sẽ không bị hỏng. Vì việc triển khai của bạn phải tuân thủ hợp đồng của giao diện. – Redlab

+0

Bạn có thể chỉnh sửa câu hỏi ban đầu của mình để thêm câu trả lời hoặc để làm rõ mọi thứ. – rsp

1

tôi sử dụng giao diện chủ yếu cho

  • mô phỏng đa kế thừa
  • xác định một hợp đồng dịch vụ và thực hiện dịch vụ
  • hợp đồng gọi lại phương pháp duy nhất

và vì

  • S ome phụ thuộc khuôn khổ tiêm đòi hỏi giao diện làm việc
  • giao diện chế giễu dễ dàng hơn lớp chế giễu
  • nhiều khuôn khổ AOP làm việc tốt hơn với giao diện so với các lớp học

Và nó không phải là thực sự là một lớp mã giữa một dịch vụ và khách hàng của mình , nhưng nhiều hơn một hợp đồng chính thức.

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