2013-02-07 45 views
5

Tôi được một ai đó nói rằng chúng ta không nên gọi một phương thức công khai của một lớp học từ một phương pháp công cộng khác trong cùng một lớp. Bây giờ tôi không thể hiểu điều này vì tôi không thấy bất kỳ vấn đề gì với điều đó. Khi phương thức đã được khai báo công khai thì hợp đồng của nó đã được sửa chữa suốt đời và do đó không có bất kỳ vấn đề nào khi gọi phương thức đó từ phương thức công khai khác.Tại sao chúng ta không nên gọi phương thức công khai từ một công chúng khác?

Vì vậy, tôi không chắc liệu tuyên bố đó có đúng hay không, hay để gọi api công khai từ một api công cộng khác [Đây là từ quan điểm thiết kế]?

+2

Tôi không biết lý do tại sao bạn câu hỏi đã bị bỏ phiếu, nhưng những gì người đó nói với bạn ** làm cho KHÔNG có ý nghĩa **. – Augusto

+0

** Vì vậy, tôi không chắc chắn nếu tuyên bố đó là đúng hay ok của nó ** làm một thử nghiệm nhỏ cho mình, tôi đoán bạn sẽ nhận được câu trả lời của bạn cho mình nếu bạn. – subodh

Trả lời

11

Trình biên dịch của bạn có bập bẹ khi bạn thử không? Không? Sau đó, nó hợp pháp trong sự tôn trọng đó.

Người cung cấp 'lời khuyên' này có tạo ra bất kỳ tài liệu chuẩn nào giải thích tiêu chuẩn (trong ngành hoặc trong tổ chức của bạn) không? Không? Sau đó, đó là ý kiến.

Tham khảo các tiêu chuẩn của công ty bạn, nhưng nếu không, tôi gọi là vô nghĩa.

2

Tôi không chắc chắn ý của anh ấy là gì. Bạn rõ ràng có thể gọi phương thức công khai từ phương thức công khai khác. Nó không phải là một ý tưởng tồi - ngay cả nguồn Java cũng có các phương thức trong đó một phương thức công khai gọi một phương thức công khai khác.

Tại sao bạn không hỏi người đã khuyên bạn giải thích lý do? Tôi nghĩ anh ấy ở vị trí tốt hơn để nói hơn chúng ta.

4

Khi bạn thường gọi các phương thức công khai từ các phương thức công cộng khác của cùng một lớp, điều đó có thể có nghĩa là bạn có các phương thức tiện ích không cần thiết. Và có lẽ bạn nên cố gắng hơn một chút DRY để dễ dàng bảo trì và giữ cho API của bạn dễ nắm bắt.

Nhưng đó chỉ là cảnh báo, hoàn toàn hợp lệ để gọi phương thức công khai từ một phương pháp khác và bạn sẽ tìm thấy nhiều ví dụ về mã tiêu chuẩn java.lang làm việc đó.

Một ví dụ từ java.lang.String:

1462 public boolean startsWith(String prefix) { 
1463  return startsWith(prefix, 0); 
1464 } 

Sẽ không có điểm trong việc đưa ra một số phương pháp riêng chỉ để thực thi một quy tắc về phương pháp nào không gọi phương pháp công cộng khác.

0

Tất nhiên bạn có thể gọi bất kỳ phương thức công khai nào từ phương thức công khai khác cho dù phương thức đó nằm trong cùng một lớp hay một lớp khác. Nhưng tiêu chuẩn không quan trọng đối với các tổ chức khác nhau. Cho anh ta/cô ấy một số ví dụ hợp lệ.

6

Nếu bạn gọi một phương thức công khai từ các phương thức công khai khác, điều đó làm cho việc kiểm tra đơn vị trở nên phức tạp hơn. Nếu một phương thức phụ thuộc vào một phương thức khác của cùng một lớp, bạn không thể giả lập nó để kiểm tra nó một cách riêng biệt. Vì vậy, bạn có thể phải viết mã thử nghiệm cho cùng một phương pháp hai lần.

cũng Unit testing a method that calls another method

0

thấy Theo tôi bạn nên tránh gọi một phương thức nào trong phương pháp khác vì thừa kế. Hãy xem xét các lớp:

public class Parent { 

    //return sum 
    public double getSum(double... value){ 
     //implementation 
    } 

    //return average 
    public double getAverage(int count){ 
     //call getSum 
     double sum = getSum(20, 40, 60); 
     return sum/count; 

    } 
} 

public class Child extends Parent { 

    @Override 
    public int getSum(double... obj){ 
     // change implementation 
     // always return 100; 
    } 
} 

Nếu bạn kêu gọi các phương pháp đối tượng trẻ em getAverage, bạn sẽ nhận được một số giá trị bất ngờ, toàn bộ giao diện của đối tượng trẻ em bị hỏng. Bạn cũng phải ghi đè phương thức getAverage ...

Ví dụ với lớp String

1462 public boolean startsWith(String prefix) { 
1463  return startsWith(prefix, 0); 
1464 } 

là từ quan điểm này sai, bởi vì chuỗi là cuối cùng, vì vậy bạn không thể thừa hưởng nó và ghi đè phương thức public của nó ..

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