Tôi có một hoạt động không đồng bộ trong Java 8, trả về lệnh gọi lại onError hoặc lệnh gọi lại onSuccess. Tôi cần quay lại bên trong phương thức của mình nếu thao tác thành công hay không. Vì vậy tôi trả về một giá trị boolean để chỉ ra thông tin này. Vấn đề tôi gặp phải là tôi gặp phải lỗi biên dịch sau:
lỗi: các biến cục bộ được tham chiếu từ một lớp bên trong phải là final hoặc có hiệu lực final
Tra cứu lỗi trên Google, tôi có thể thấy rằng bạn không cho phép loại thao tác này, nhưng làm cách nào để quay lại nếu thao tác thành công hay thất bại?
public Boolean addUser(Chuỗi email, Chuỗi mật khẩu) {
Boolean isSuccess = false;
Bản đồ mục = new HashMap ();
item.put("email", new AttributeValue(email)); //email
item.put("mật khẩu", new AttributeValue(mật khẩu)); //mật khẩu
dynamoDB.putItemAsync(mới PutItemRequest().withTableName("Người dùng").withItem(mục), mới AsyncHandler() {
@Ghi đè
public void onError(Ngoại lệ trừ) {
}
@Ghi đè
public void onSuccess(AmazonWebServiceRequest rqst, Kết quả đối tượng) {
isSuccess = đúng;
}
});
trả về isSuccess;
}
Trước tiên, tôi sẽ giải thích ý nghĩa của thông báo lỗi, sau đó tôi sẽ cho bạn biết thiết kế của bạn có vấn đề gì và đề xuất cách khắc phục.
Đầu tiên là thông báo lỗi. isThành công
là một biến cục bộ, nghĩa là, một khi phương thức thêmNgười dùng
Xong, nó biến mất. Tuy nhiên, bạn tạo Trình xử lý Async
Thời gian tồn tại của phiên bản có thể dài hơn thế này. Nếu vậy, nó sẽ đề cập đến một biến không còn tồn tại.
Đây sẽ không thành vấn đề nếu biến là cuối cùng hoặc thực sự là cuối cùng. Khi đó chúng ta biết rằng biến đó không bao giờ thay đổi, vì vậy chúng ta có thể sao chép biến đó sang đối tượng mới được tạo và tham chiếu đến bản sao đó. Lưu ý rằng trong trường hợp các biến tham chiếu,Trích dẫn không thay đổi, đối tượng mà nó đề cập tới vẫn có thể bị sửa đổi.
Để tránh vấn đề này, những người tạo ra Java đã quyết định rằng bạn không thể tham chiếu các biến cục bộ không phải cuối cùng (hoặc thực sự là cuối cùng) từ các lớp bên trong ẩn danh (hoặc biểu thức lambda). Thông báo lỗi cho bạn biết rằng bạn đang làm điều này.
Bắt đầu thiết kế của bạn bây giờ. Thiết kế của bạn không hoạt động theo cách này. Trình xử lý Async
Phiên bản có thể tồn tại cho đến khi phương thức hoàn thành. Các phương thức của nó có thể được thực thi trong các luồng khác nhau, vì vậy các phương thức của nó có thể được thực thi trong thêmNgười dùng
Được gọi sau khi phương thức hoàn thành. Vì thế thêmNgười dùng
Những gì nên được trả lại? Tại thời điểm nó hoàn thành, nó thậm chí có thể không biết liệu hoạt động có thành công hay không!
Bạn thực hiện hành độngkhông đồng bộ, nghĩa là, trên các chủ đề khác nhau. Thao tác này có thể mất 1 mili giây, 1 phút hoặc thậm chí 10 năm. Nếu bạn muốn xem hoạt động có thành công hay không, bạn phải bằng cách nào đó chuyển kết quả của nó cho quá trình thực thi thêmNgười dùng
chủ đề.
Giao tiếp giữa các luồng không phải là một nhiệm vụ tầm thường, nhưng bạn thật may mắn:Đặt mục không đồng bộ
Trả lại một Tương lai
ví dụ, trong khi Tương lai
Lớp này được thiết kế chính xác cho những gì bạn muốn làm: tìm hiểu xem một thao tác không đồng bộ đã hoàn thành chưa và nhận kết quả của nó.
Để kiểm tra xem một thao tác không đồng bộ đã hoàn tất hay chưa, hãy thăm dò kết quả được trả vềTương lai
củađã xong()
phương pháp. Nếu hoàn tất, bạn có thể thực hiện việc này bằng cách gọiTương lai
củalấy()
Phương pháp để có được kết quả của hoạt động. Nếu thao tác bị hủy bỏ bằng cách ném ra một ngoại lệ,lấy()
sẽ ném Ngoại lệ thực thi
,Cái đó getCause()
là ngoại lệ được ném.
Hoặc, tất nhiên, bạn quyết định sử dụng đặt mục
Các phương thức chạy các hoạt động một cách đồng bộ (trên cùng một luồng). Phương pháp của bạn sau đó sẽ đợi thao tác hoàn tất và bạn sẽ nhận được kết quả ngay lập tức.
Tôi là một lập trình viên xuất sắc, rất giỏi!