2012-06-11 36 views
6

Trong khi tìm kiếm thông qua các mã nguồn Selenium tôi nhận thấy sau trong PageFactory:khai báo lại các thông số

public static <T> T initElements(WebDriver driver, Class<T> pageClassToProxy) { 
    T page = instantiatePage(driver, pageClassToProxy); 
    initElements(driver, page); 
    return page; 
} 

public static void initElements(WebDriver driver, Object page) { 
    final WebDriver driverRef = driver; 
    initElements(new DefaultElementLocatorFactory(driverRef), page); 
} 

lợi ích của việc có các dòng sau là gì?

final WebDriver driverRef = driver; 

Sẽ không có ý nghĩa khi chỉ thực hiện tham số cuối cùng, sau đó chuyển thông số đó sang phương pháp tiếp theo mà không khai báo tham chiếu mới?

+3

Đúng. Điều đó sẽ có ý nghĩa hơn. –

+1

Có thể nhà phát triển không biết về công cụ sửa đổi 'final'? lolz – user1329572

+0

Trong khi điều này không trả lời câu hỏi, tôi rất nghi ngờ nó sẽ được biên dịch ra bytecode bởi jvm như là một no-op. – corsiKa

Trả lời

3

Vâng, câu trả lời là đặt final trên một biến và chỉ sử dụng nó làm đối số cho hàm là hoàn toàn vô dụng. Trong hàm tạo DefaultElementLocatorFactory, biến liên quan đến đối số đầu vào có thể được gán lại tự do, vì nó là bản sao của tham chiếu ban đầu.

P.S. ... trừ khi tất nhiên, theo đề xuất của OP, tham số đầu vào thay vào đó được khai báo là final.

+0

Tôi phải chỉ ra rằng tôi cảm thấy khá lame cung cấp câu trả lời này, nhưng tôi không thấy bất cứ điều gì khác để nói và ai đó phải, tôi đoán ... –

2

Điều tốt nhất tôi có thể đưa ra (theo giả định rằng các nhà phát triển Selene có nhiều hơn một sự hiểu biết cơ bản về java làm việc như thế nào - mà tôi nghĩ được đưa ra):

Có lẽ trước khi có một lớp DefaultElementLocatorFactory, phương pháp đã sử dụng một chức năng bên trong vô danh và khi mã được tái cấu trúc một số phần chỉ bị bỏ qua.

+0

Đây là lý do tại sao tôi hỏi, tôi muốn đảm bảo rằng tôi đã không bỏ lỡ một số lỗi JVM hoặc phép thuật đã xảy ra mà chỉ đơn giản là không được nhận xét. – Scott

+0

@Scott Trong thực tế cuối cùng hoặc không có cuối cùng sẽ tạo ra chính xác cùng một bytecode, ngoại trừ việc JLS cho phép nội tuyến của các biến cuối cùng trong các tình huống nhất định. Đó là cơ bản cách đóng bao hoạt động cho các lớp ẩn danh, lần đầu tiên được thêm vào để 'if (DEBUG) {]' có thể được tối ưu hóa và nói chung là một điều khủng khiếp để tìm nguồn gốc của các lỗi. Nhưng không ai trong số đó áp dụng cho mã của bạn. – Voo

+0

Tôi đã cung cấp cho +1 này, nhưng không tìm thấy bằng chứng cho tuyên bố rằng nó đã được sử dụng bởi một chức năng bên trong vô danh (tôi đã xem qua lịch sử cam kết trên mã Google). Tuy nhiên, tôi đoán đó là khả năng. – Scott

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