2017-08-20 25 views
8

Tại sao các phương thức tĩnh được hỗ trợ từ Java 8? Sự khác nhau giữa hai dòng trong phương thức chính trong mã dưới đây là gì?Mục đích của một phương thức tĩnh trong giao diện từ Java 8 là gì?

package sample; 
public class A { 
    public static void doSomething() 
    { 
     System.out.println("Make A do something!"); 
    } 
} 

public interface I { 
    public static void doSomething() 
    { 
     System.out.println("Make I do something!"); 
    } 
} 

public class B { 
    public static void main(String[] args) { 
     A.doSomething(); //difference between this 
     I.doSomething(); //and this 
    } 
} 

Như chúng ta có thể thấy ở trên, tôi thậm chí không thực hiện trong B. mục đích gì nó sẽ phục vụ để có một phương pháp tĩnh trong một giao diện khi chúng ta có thể viết phương pháp tĩnh cùng trong lớp khác và gọi nó? Nó được giới thiệu cho bất kỳ mục đích nào khác ngoài mô đun. Và theo tính mô đun, ý tôi là như sau:

public interface Singable { 
    public void sing(); 
    public static String getDefaultScale() 
    { 
     return "A minor"; 
    } 
} 

Chỉ cần đặt các phương thức giống nhau.

+3

Điều đó nên giải thích: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – Marvin

+1

Không có sự khác biệt. – Professor901

+1

Các phương thức tĩnh cung cấp các phương thức mặc định để triển khai các lớp không ghi đè lên. Nó đặc biệt hữu ích nếu logic phương thức được nhân rộng trên tất cả các triển khai. Ví dụ của bạn là hữu ích, nói rằng các lớp PopSong và RockSong có thể thực hiện nó và cả hai sẽ có quy mô mặc định là Trẻ vị thành niên. –

Trả lời

8

Trước đây, nếu bạn có giao diện Foo và muốn nhóm các utils hoặc phương thức nhà máy liên quan đến giao diện, bạn cần phải tạo một lớp utils riêng lẻ FooUtils và lưu trữ mọi thứ ở đó.

Các lớp đó sẽ không có bất kỳ điểm chung nào ngoài tên và ngoài ra, lớp utils sẽ cần phải được thực hiện final và có một hàm tạo riêng để cấm sử dụng không mong muốn.

Bây giờ, nhờ vào các phương thức tĩnh giao diện, bạn có thể giữ mọi thứ ở một nơi mà không cần tạo bất kỳ lớp bổ sung nào.

Nó cũng quan trọng để không quên tất cả hoạt động tốt và không ném tất cả mọi thứ mindlessly để một lớp giao diện - như đã chỉ ra trong this answer

+1

@GrzegorzPiwowarek 'Bộ sưu tập',' StreamSupport', 'Spliterators' không phải là các lớp thừa; phải có một dòng mã * quá nhiều * bên trong một giao diện. – Eugene

+1

@Eugene Tất nhiên, sẽ luôn có một số ngoại lệ và đây là một ví dụ rất tốt. Đặt tất cả điều này vào một lớp học sẽ dẫn đến một mớ hỗn độn không thể quản lý –

5

Có chủ yếu là hai lý do cho phương pháp tĩnh bên trong giao diện: create instances của những giao diện (và mã rõ ràng là ở đâu); như Stream.of hoặc Stream.generate, v.v. Và lý do thứ hai sẽ là utility methods là chung chung cho tất cả các loại đó.

Vẫn giao diện phải là xóa và không phải tạo thêm sự lộn xộn trong API. Ngay cả mã jdk cũng có Collectors - phương pháp nhà máy tĩnh, nhưng ví dụ như giao diện Collector. Những phương thức đó có thể được hợp nhất thành giao diện Collector, nhưng điều đó sẽ làm cho giao diện trở nên khó khăn hơn so với nó.

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