Gần đây tôi đã xem xét rất nhiều mã (vì lợi ích của chính mình, vì tôi vẫn đang học lập trình), và tôi đã nhận thấy một số dự án Java (từ những gì dường như là những lập trình viên được tôn trọng) trong đó họ sử dụng một số loại ngay lập tức xuống đúc.Lợi ích của việc truyền xuống ngay lập tức là gì?
Tôi thực sự có nhiều ví dụ, nhưng đây là một mà tôi kéo thẳng từ mã:
public Set<Coordinates> neighboringCoordinates() {
HashSet<Coordinates> neighbors = new HashSet<Coordinates>();
neighbors.add(getNorthWest());
neighbors.add(getNorth());
neighbors.add(getNorthEast());
neighbors.add(getWest());
neighbors.add(getEast());
neighbors.add(getSouthEast());
neighbors.add(getSouth());
neighbors.add(getSouthWest());
return neighbors;
}
Và từ cùng một dự án, đây là khác (có lẽ ngắn gọn hơn) ví dụ:
private Set<Coordinates> liveCellCoordinates = new HashSet<Coordinates>();
Trong ví dụ đầu tiên, bạn có thể thấy rằng phương thức có kiểu trả về là Set<Coordinates>
- tuy nhiên, phương thức cụ thể đó sẽ luôn chỉ trả lại HashSet
- và không có loại nào khác là Set
.
Trong ví dụ thứ hai, liveCellCoordinates
ban đầu được định nghĩa là Set<Coordinates>
, nhưng ngay lập tức được chuyển thành HashSet
.
Và nó không chỉ là dự án cụ thể duy nhất này - tôi đã tìm thấy điều này là trường hợp trong nhiều dự án.
Tôi tò mò về logic đằng sau điều này là gì? Có một số quy ước mã sẽ xem xét thực hành tốt này? Liệu nó làm cho chương trình nhanh hơn hoặc hiệu quả hơn bằng cách nào đó? Nó sẽ có lợi ích gì?
Đây thực sự là ví dụ về việc tạo hình (từ một loại cụ thể đến loại rộng hơn). Xem, ví dụ: [Wikipedia entry on downcasting] (http://en.wikipedia.org/wiki/Downcasting). –
@TedHopp Lấy ví dụ thứ hai mà tôi đã cung cấp, trong ví dụ đó tôi bắt đầu như là một 'Set', và sau đó chuyển đổi thành một' HashSet' (tôi tin rằng 'HashSet' là cụ thể hơn' Set'). Điều đó sẽ không được đúc? Vì tôi sẽ chuyển từ kiểu 'Set' thành một kiểu' HashSet' cụ thể? – Bob
Trong ví dụ thứ hai, bạn đang tạo một 'HashSet' và chuyển đổi nó thành một' Set' khi gán nó cho 'liveCellCoordinates'. Không tồn tại đối tượng 'Set' nào cho đến khi biểu thức' new' được đánh giá và không có 'Set' đang được chuyển thành một' HashSet'. –