sách gpt4 ăn đã đi

java - biến cục bộ phải là biến cuối cùng hoặc cuối cùng có hiệu lực

In lại Tác giả: Walker 123 Thời gian cập nhật: 29-11-2023 10:00:12 31 4
mua khóa gpt4 giày nike

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;

}

câu trả lời hay nhất

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 laiLớ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.

Về java - các biến cục bộ phải là biến cuối cùng hoặc cuối cùng một cách hiệu quả, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/34570747/

31 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress