2015-01-06 15 views
7

vì vậy tôi chỉ thấy mã này tại nơi làm việc và tác giả đã nói với tôi đó là để tối ưu hóa nội tuyến.Tối ưu hóa nội tuyến Java là chính xác?

Class Test{ 
... 
void init(){ 
    //sets variables, call functions, etc 
} 
... 
} 

sau đó ông gọi nó trong chính như thế này

Test t=new Test(); 
t.init(); 

Thay vì có một constructor mặc định với mã từ init() trong đó. Anh ấy nói với tôi đó là để tối ưu hóa nội tuyến. Điều này có đúng không? Làm thế nào là nó nhanh hơn? nơi tôi đọc về điều này?

+4

Hãy hỏi tác giả. –

+4

Không có gì tối ưu hóa bất cứ điều gì trong mã của bạn .. – Maroun

+0

Làm thế nào mà nghĩa vụ phải làm việc? – Natix

Trả lời

14

Nó không nhanh hơn. Dường như được dựa trên giả định rằng một phương pháp có thể được gạch chân nhưng một nhà xây dựng không thể. Thật không may đó là vô nghĩa, do đó, toàn bộ điểm của nó đi ra ngoài cửa sổ.

Thậm chí nếu điều này nhanh hơn, nó gần như chắc chắn sẽ là một ý tưởng tồi. Mã không được tối ưu hóa với chi phí dễ đọc, ngoại trừ trong trường hợp cực đoan mà mỗi chu kỳ CPU cuối cùng là rất quan trọng và trong trường hợp đó, bạn không thể sử dụng Java.

Thực tế, điều này còn tồi tệ hơn việc khó đọc hơn. Việc tái cấu trúc tiếp theo chắc chắn sẽ là cho phương thức khởi tạo Test để gọi phương thức init(), để nó không phải luôn luôn được thực hiện thủ công (và làm theo cách thủ công là một nỗi đau và một nguồn lỗi tiềm tàng nếu nó bị lãng quên); và thực hành xấu nếu một hàm tạo gọi một phương thức có thể bị ghi đè, bởi vì một lớp con có thể vô tình thay đổi những gì xảy ra tại thời điểm xây dựng khi hàm tạo siêu lớp được gọi (xem this question để biết thêm chi tiết). Khi điều này xảy ra, một lớp con của Test trong cùng một gói sẽ có thể ghi đè phương thức init() và sau đó khi lớp con gọi super(), hoặc ngầm hoặc rõ ràng, hàm tạo của lớp cha sẽ kết thúc gọi ghi đèinit(). (Vấn đề cụ thể này có thể bị loại bỏ bằng cách tuyên bố init()private.)

Đừng làm điều đó.

+0

Nếu có 2 nhà thầu thì sao?Sẽ dễ đọc hơn nếu cả hai được gọi là phương thức init – JClassic

+0

_Unless_ phương thức 'init' đang làm bất cứ điều gì đa luồng (chẳng hạn như đăng ký' this' như một người nghe đến một số chủ đề khác, bắt đầu một chuỗi mới biết về 'this', v.v.), trong trường hợp này bạn _must_ giữ 'init()' riêng biệt cho an toàn luồng. – yshavit

+2

@JClassic Một cách tốt nhất để xử lý đó là bằng cách tạo một hàm dựng "chuẩn" (có thể là riêng tư, nếu cần) và có các hàm tạo khác gọi nó thông qua 'this (someArg, anotherArg, maybeSomeArg + 42)'. – yshavit

1

Tôi không nghĩ rằng bạn có bất cứ điều gì để tối ưu hóa. Điều đó đang được nói, tôi không nghĩ rằng đó là một ý tưởng tốt ở một giai đoạn thiết kế hoặc bởi vì khởi tạo lớp học là một cái gì đó mà mỗi lớp phải làm một mình. Đặt hành vi như vậy trong một phương pháp riêng biệt đó:

  1. Có được gọi riêng
  2. thể, đến lượt nó cũng được ghi đè

là một cái gì đó thường không được khuyến khích.

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