Vì bạn vẫn cần một hàm khác để truy xuất giá trị, vì vậy không có gì có thể đạt được.
Trong ResultSet, next() đưa bạn đến bản ghi tiếp theo hoặc trả về false nếu không có. Sau đó, bạn làm getString(), getInt() hoặc bất cứ điều gì để lấy giá trị trường. Vì vậy, bạn viết mã như sau:
while (rs.next())
{
name=rs.getString("name"); // or whatever
... do something with name ...
}
Trong Iterator, hasNext() trả về giá trị đúng hoặc sai để cho biết nếu có một bản ghi khác. Sau đó, bạn gọi next() để lấy giá trị. vì vậy, bạn viết mã như:
while (iter.hasnext())
{
name=iter.next(); // or whatever
... do something with name ...
}
Mẫu kết thúc tương tự. Thật không may là việc triển khai không nhất quán. Đó là, ResultSet.next không chỉ cho bạn biết nếu bạn đang ở cuối mà còn tiến bộ các positoin, trong khi Iterator.hasNext cho bạn biết nếu bạn đang ở cuối nhưng không thăng tiến vị trí. Nhưng thực tế sử dụng là khá giống nhau.
Nó sẽ không thực sự làm việc để cố gắng kết hợp Iterator.hasNext và Iterator.next vào một hàm. Làm thế nào bạn sẽ biết khi bạn đạt đến kết thúc? Bạn có thể nói rằng nó trả về null ở cuối ... nhưng nếu null là giá trị hợp lệ trong danh sách thì sao? Tôi cho rằng bạn có thể thêm một số giá trị ma thuật, nhưng bạn vẫn có vấn đề phân biệt ý nghĩa ma thuật từ một mục trong danh sách vừa xảy ra để có giá trị đó. Giống như nếu bạn có một danh sách các int, bạn có thể nói rằng -1 có nghĩa là kết thúc của danh sách, nhưng sau đó những gì nếu danh sách bao gồm một giá trị -1?
Cách duy nhất khác mà tôi thấy là để hàm next() trả về một đối tượng bao gồm cả chỉ báo cuối danh sách và, nếu có, giá trị. Nhưng điều này sẽ là một nỗi đau để sử dụng. Bạn phải viết một cái gì đó như:
while (true)
{
IterableResult ir=iter.next();
if (ir.end)
{
break;
}
else
{
name=ir.value;
... do something with name ...
}
}
Điều đó dường như không đạt được gì.
Có thể có một cách tiếp cận khác có thể hoạt động tốt hơn, nhưng tôi không thể nghĩ ra. Và dường như những người sáng tạo của giao diện Iterator cũng không thể nghĩ ra một cách tốt hơn! :-)
Tôi đã thử một cái gì đó như thế này trong khi ((o = itr.next())! = Null), tôi nhận được NoSuchElementException. Nếu bạn thấy việc thực hiện phương thức iterator() trong các lớp khác nhau, bạn sẽ thấy NoSuchELementException được ném bằng cách kiểm tra điều kiện khác nhau. Ví dụ, Abstractlist có khối catch đẹp của IndexOutOfBoundsException để ném NoSuchElementException và trong lớp LinkedBlockingDeque chúng ta có tiếp theo! = Null kiểm tra – Delta