2012-02-07 28 views
10

Trong dự án của tôi, tôi cần phải tạo các đối tượng cho từng loại Toán tử Java như "Add", "Substraction", "Multiplication", vv.Java - các cá thể thực hiện bên trong một giao diện

Vì vậy, đây là những gì tôi sẽ làm. Tôi định nghĩa toán tử toán tử là một giao diện và tôi đặt những thực thi đó bên trong nó vì tôi không muốn định nghĩa các lớp singleton cho mỗi toán tử.

public interface MathOperator { 


double operate(double a, double b); 

MathOperator ADD = new MathOperator(){ 

    @Override 
    public double operate(double a, double b) { 
     return a + b; 
    } 

}; 

MathOperator SUBSTRACT = new MathOperator(){ 

    @Override 
    public double operate(double a, double b) { 
     return a - b; 
    } 

}; 

} 

Tôi không thấy nhiều việc sử dụng như vậy khi tôi sử dụng Google. Vì vậy, tôi tự hỏi nếu đây là một thực hành tốt và nếu có cách tiếp cận tốt hơn và duyên dáng hơn?

+0

chúng tĩnh theo mặc định –

Trả lời

5

tôi sẽ làm SMT như

1) Xác định giao diện

interface MathOperator { 
    double operate(double a, double b); 
} 

2) Có một số thực hiện phổ biến trong enum (ít mã)

enum MathOperators implements MathOperator { 
    ADD { 
     @Override 
     public double operate(double a, double b) { 
      return a + b; 
     } 
    }, 

    SUBTRACT { 
     @Override 
     public double operate(double a, double b) { 
      return a - b; 
     } 
    } 
} 

3) Hoặc thành viên tĩnh công cộng (giải pháp sạch hơn).

class MathOperators { 
    public static MathOperator ADD = new MathOperator() { 
     @Override 
     public double operate(double a, double b) { 
      return a + b; 
     } 
    }; 
    public static MathOperator SUBTRACT = new MathOperator() { 
     @Override 
     public double operate(double a, double b) { 
      return a - b; 
     } 
    }; 
} 
  • có thể tạo mới MathOperator mà không thay đổi MathOperators
  • có API tốt đẹp cho hoạt động phổ biến
  • không nên viết độc thân
  • có giao diện sạch đẹp
+2

Bạn cần phải làm cho 'MathOperators' thực hiện' MathOperator' nếu không bạn không phải @ Ghi đè bất cứ thứ gì. –

+0

@Peter Cảm ơn điểm. –

+0

Vâng, điều này có vẻ tốt hơn tôi sẽ có giải pháp 'triển khai thực hiện enum'. Cảm ơn. – Jay

4

Tôi thường sử dụng mẫu này, đặc biệt là cho việc triển khai cụ thể các giao diện chung. Tôi thấy nó hoạt động thực sự tốt cho tôi.

Tôi thích cách đặt các triển khai nơi bạn có thể tìm thấy chúng. Tôi làm điều đó hơi khác một chút - tôi làm cho chúng tĩnh (đó là một điều phong cách, do đó giao diện sẽ trông giống như lớp impls):

public interface MathOperator { 

    double operate(double a, double b); 

    public static MathOperator ADD = new MathOperator() { 
     @Override 
     public double operate(double a, double b) { 
      return a + b; 
     } 
    }; 

    public static MathOperator SUBSTRACT = new MathOperator() { 
     @Override 
     public double operate(double a, double b) { 
      return a - b; 
     } 
    }; 

} 
+3

chúng tĩnh theo mặc định –

+0

có, nhưng đối với lớp trừu tượng tôi sử dụng tĩnh, do đó, kiểu mã vẫn nhất quán – Bohemian

2

Tôi không thấy vấn đề gì với nó. Lấy ví dụ java.lang.String.CASE_INSENSITIVE_ORDER. Nó gần như là giống nhau, ngoại trừ việc

  1. Chuỗi không phải là một giao diện nhưng một lớp thức
  2. Các Comparator không được khai báo sử dụng một lớp vô danh, nhưng sử dụng một lớp bên trong tĩnh, trong đó chủ yếu là giống
5

Một thành ngữ mà tôi đã nhìn thấy được sử dụng trong một cách chính xác những trường hợp này là việc sử dụng enum:

public enum MathOperator { 

    ADD { 
     @Override 
     public double operate(double a, double b) { 
      return a + b; 
     } 
    }, 

    SUBTRACT { 
     @Override 
     public double operate(double a, double b) { 
      return a - b; 
     } 
    }; 

    public abstract double operate(double a, double b); 

} 
+2

enums OK khi bạn có số lượng hữu hạn có thể, nhưng khi bạn chỉ muốn một số thông thường, tiện ích, giao diện hằng số quy tắc. Những gì bạn có thể * làm mặc dù có 'enum MathOperatorImpl thực hiện MathOperator'! Tôi thích điều đó hơn nữa !! : D – Bohemian

+0

Cảm ơn @Bohemian, tôi sẽ thực hiện giải pháp 'enum implements interface'. – Jay

+0

@Bohemian Tôi nhớ một đề xuất như vậy trong Java hiệu quả, để sử dụng các giao diện để mô phỏng các enums mở rộng. Tôi nghĩ rằng Jay là absoultely quyền sử dụng giải pháp này. – Malcolm

1

Cá nhân, tôi không thích đặt triển khai trong các giao diện. Tôi sẽ hoặc là:

  • làm MathOperator một enum
  • giữ giao diện nhưng có một nhà máy hoặc một lớp tĩnh (nói MathOperators) với việc triển khai
0

Tại sao không bạn xác định từng triển khai trong lớp/tệp của riêng nó? Điều này sẽ làm cho nó rõ ràng hơn và sẽ để lại giao diện sạch sẽ.

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