2011-08-22 39 views
11

Vui lòng cho tôi biết nếu điều này không phù hợp như được xây dựng (đặc biệt cho dù là Lập trình viên.SE hoặc điều gì đó sẽ tốt hơn cho câu hỏi.)Cách để đạt được các đặc điểm Java hiệu quả?

Được rồi. Vì vậy, tôi đã có một số "đặc điểm" mà tôi hiện đang thể hiện như là giao diện. Hãy gọi chúng là "có thể cập nhật" và "có thể phá hủy". Việc diễn đạt chúng dưới dạng giao diện có nhược điểm là tôi không thể chia sẻ hành vi giữa tất cả các thành phần "có thể phá hủy"; mặt khác, thể hiện các lớp trừu tượng này có nghĩa là tôi không thể trộn và kết hợp mà không xác định rõ ràng đặc điểm hỗn hợp như một lớp trừu tượng khác ("UpdateableAndDestructible") và hơn nữa điều này giống như một sự lạm dụng chức năng lớp trừu tượng tại thời điểm đó. Nó có lẽ là những gì tôi sẽ kết thúc làm nếu không có cách nào sạch hơn xử lý này, tuy nhiên.

Các tùy chọn của tôi là gì so với các giải pháp Java thuần túy đối với câu hỏi hóc búa này? Có thể cho tôi để mô tả hành vi chia sẻ và sau đó trộn và kết hợp như tôi thấy phù hợp mà không cần phải mô tả rõ ràng mỗi hoán vị tôi sẽ sử dụng?

+2

Bạn đang descibing * mixins * - đó có thể là một thuật ngữ hữu ích nếu bạn đang làm một Tìm kiếm. – Jesper

Trả lời

6

Có thể bạn đạt được mục tiêu bằng cách sử dụng kết hợp giao diện và triển khai mặc định.

Giống như:

public interface Updatable { 
    void updated(); 
} 

public interface Loadable { 
    void load(); 
} 

public class DefaultUpdatable implements Updatable { 
... 
} 

public class DefaultLoadable implements Loadable { 
... 
} 

public class SomeObject implements Updatable, Loadable { 
    private final Updatable updatable = new DefaultUpdatable(); 
    private final Loadable loadable = new DefaultLoadable(); 

    public void load() { 
    this.loadable.load(); 
    } 

    public void updated() { 
    this.updatable.updated(); 
    } 
} 

Tuy ồn ào và có thể không linh động như bạn muốn nhưng có lẽ một chút sạch hơn làm điều UpdatableAndDestructable.

+0

+1 và được chấp nhận, đây là một cách hợp lý để xử lý sự cố. (Chỉ trong quá khứ, trong khi điều tra điều này tôi đã tìm thấy một số khung công tác hữu ích như Guice mà làm cho nó một chút ít đau đớn để sử dụng loại logic này.) –

4

Tôi biết bạn đã nói "thuần Java", nhưng đây là điều gì đó Scala hoạt động tốt. Các hạn chế trong ngôn ngữ Java chính là trình điều khiển mạnh mẽ để mọi người sử dụng các ngôn ngữ JVM khác ...

+0

Cảm ơn đề xuất này. –

5

Tôi không nghĩ rằng có một giải pháp khá tốt cho vấn đề này, nhưng có thể một vài giải pháp khả thi tùy thuộc vào mức độ bạn coi thường bản mẫu.

Bạn có thể xác định một đặc điểm là một giao diện lớp + khác, lấy đối tượng thể hiện làm tham số đầu tiên. Và họ thực hiện giao diện với lớp bạn muốn có đặc điểm. Sau đó, tạo các phương thức stub gọi các phương thức trên implit.

public class MyClass implements MyTrait { 
    @Override 
    public void doSomething() { 
     MyTraitImpl.doSomething(this); 
    } 
} 

Và sau đó cho các đặc điểm riêng của mình:

public interface MyTrait { 
    public void doSomething(); 
} 

public class MyTraitImpl { 
    public static void doSomething(MyTrait obj) { 
     // do something with obj 
    } 
} 

Như Ernest Friedman-Hill nói tho, Scala thực hiện điều này cho bạn (như tôi hiểu nó, đây là cách nó thực hiện những đặc điểm trên JVM) .

1

Trong trường hợp bạn xem xét sử dụng lombok như tinh khiết Java, bạn có thể đơn giản hóa cuộc sống của bạn bằng cách sử dụng @Delegate như thế này:

public class SomeObject implements Updatable, Loadable { 
    @Delegate private final Updatable updatable = new DefaultUpdatable(); 
    @Delegate private final Loadable loadable = new DefaultLoadable(); 
} 
Các vấn đề liên quan