2009-09-17 28 views
7

Gần đây, có một câu hỏi đặt ra một ý tưởng hay trong Java để gán kết quả gọi hàm getter đến biến cục bộ để tránh nhiều cuộc gọi đến cùng một trình truy cập. Tôi không thể tìm thấy bài viết gốc nhưng sự đồng thuận dường như là điều này nói chung là không cần thiết vì Hotspot sẽ tối ưu hóa các cuộc gọi phương thức trên không anyway.Phân bổ biến cục bộ để tránh nhiều phôi

Tuy nhiên, quan điểm về việc sử dụng kỹ thuật này để tránh nhiều phôi là gì? Tại thời điểm này tôi đang phải đối mặt với một sự lựa chọn giữa:

if (a instanceof Foo) { 
    // Cast once and assign to local variable. 
    Foo foo = (Foo)a; 

    if (foo.getB() == 1 && foo.getC() == 2) { 
    ... 
    } 
} 

HOẶC

if (a instanceof Foo) { 
    // Cast twice making code compact but possibly less readable. 
    // Also, is there an overhead in multiple casts? 
    if (((Foo)a).getB() == 1 && ((Foo)a).getC() == 2) { 
    ... 
    } 
} 

Trả lời

12

Chắc chắn là đi đầu tiên. Sự khác biệt về hiệu suất có thể không liên quan, nhưng khả năng đọc là chắc chắn là được cải thiện.

Ngoài việc loại bỏ phôi, điều này cũng có nghĩa là bạn có thể sử dụng một tên khác - sau khi tất cả, bây giờ bạn biết thêm về biến này, do đó, bạn nên đặt tên cụ thể hơn. Đó không phải luôn luôn như vậy, nhưng nó có thể. "Giới thiệu biến cục bộ vì mục đích đặt tên một giá trị" kỹ thuật tái cấu trúc là một giá trị được đánh giá thấp, ngay cả khi không có phôi ...

3

Tôi thích là người đầu tiên, vì nó trông sạch sẽ hơn. Cái thứ hai bắt đầu trông giống như Lisp. Nhưng đó chỉ là ý kiến ​​cá nhân.

+0

Có vấn đề gì với Lisp? –

+2

Không có gì, tôi yêu Lisp, nó chỉ xảy ra có rất nhiều dấu ngoặc đơn, đó là tất cả. –

19

Tôi thích tạo biến cục bộ hơn là luôn truyền vì các vấn đề về khả năng đọc. Mã khả năng đọc, đối với tôi (hoặc các nhà phát triển khác làm việc trên cùng một mã), là một vấn đề quan trọng.

Lo lắng về hiệu suất ở giai đoạn này đánh tôi như một ví dụ về mẫu "tối ưu hóa sớm".

+0

Cảm ơn - Đây thực sự là cách tiếp cận ưa thích của tôi; Tôi chỉ muốn một số xác nhận từ cộng đồng lập trình viên. – Adamski

1

Hoàn toàn là một ý tưởng tốt vì nó cải thiện độ rõ ràng. Tôi sẽ nói rằng áp dụng cho việc tránh nhiều cuộc gọi truy cập quá - đó là một ý tưởng tốt cho rõ ràng không phải lý do hiệu suất.

3

Tôi muốn nói điều quan trọng là không tối ưu hóa sớm. Nếu có một chi phí để đúc, nó có thể là quá nhỏ mà nó sẽ có hiệu quả không đáng kể trong thực tế. Trừ khi đoạn mã này tạo thành phần lớn thời gian CPU của ứng dụng của bạn, tôi không nghĩ rằng bạn sẽ thấy bất kỳ sự khác biệt hiệu suất có thể đo lường nào giữa hai.

Do đó, tôi cũng chọn tùy chọn đầu tiên vì nó trông sạch hơn và dễ hiểu và dễ sửa hơn - quan trọng hơn nhiều so với thực hiện một vài chu kỳ đồng hồ nhanh hơn trong 99,99% tình huống.

1

Tôi thích tùy chọn đầu tiên, vì hai lý do

  1. Các parantheses cần thiết làm cho cludgy mã và khó đọc
  2. Có thể là một (nhỏ) hất trong dàn diễn viên
0

tôi thích đầu tiên, không chỉ cho khả năng đọc mã, mà còn cho việc gỡ lỗi thời gian chạy (ví dụ cho ví dụ ban đầu - nếu bạn đặt kết quả của getter trong một địa phương, bạn thấy giá trị đó thay vì phải truy tìm vào getter lần đầu tiên) .

0

Tôi đồng ý với những người nói rằng phiên bản đầu tiên là thích hợp hơn, nhưng tôi muốn thêm rằng nếu có thể - và hầu như luôn luôn có thể — bạn nên tránh truyền ngay từ đầu.Không phải vì bất kỳ lý do hiệu suất nào, nhưng chỉ để kiểm tra thêm về độ chính xác của mã.

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