Tôi đang viết một phương pháp trong Java:DRY: Giảm thiểu đang lặp đi lặp lại trong Java
List<Foo> computeFooList(/* arguments */)
{
/* snip */
}
Tôi muốn viết một phương pháp thứ hai với chính xác cùng một logic, nhưng một kiểu trả về khác nhau:
List<String> computeStringList(/* same arguments */)
{
/* snip */
}
Tôi đang cố gắng tìm ra cách không hack để giảm thiểu số lượng mã lặp lại giữa hai phương pháp. Sự khác biệt chỉ logic giữa hai là, khi thêm một đối tượng vào danh sách đó là quay trở lại, phương pháp đầu tiên thêm acutal Foo
:
List<Foo> computeFooList(/* arguments */)
{
List<Foo> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo);
}
}
...
return toReturn;
}
và thứ hai cho biết thêm một đại diện String
của Foo
:
List<String> computeStringList(/* same arguments */)
{
List<String> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo.toString());
}
}
...
}
Trong thực tế, nó không hoàn toàn rằng đơn giản. Tôi không muốn thêm Foo
vào toReturn
trừ khi tôi hoàn toàn chắc chắn rằng nó thuộc về đó. Kết quả là, quyết định đó được thực hiện theo số foo
bằng cách sử dụng các hàm trợ giúp. Với hai phiên bản khác nhau của các phương thức, tôi cũng cần các phiên bản khác nhau của các hàm trợ giúp - cuối cùng, tôi sẽ viết hai tập các phương thức giống hệt nhau, nhưng với một kiểu chung chung nhỏ.
Tôi có thể viết một phương pháp duy nhất chứa tất cả các logic ra quyết định, nhưng có thể tạo ra hoặc là một List<Foo>
hoặc một List<String>
? Có thể làm điều này mà không cần sử dụng các loại thô List
(thực hành không tốt trong đất generics!) Hoặc ký tự đại diện List<?>
loại? Tôi hình dung triển khai trông giống như thế này:
List<Foo> computeFooList(/* args */)
{
return computeEitherList(/* args */, Foo.class);
}
List<String> computeStringList(/* args */)
{
return computeEitherList(/* args */, String.class);
}
private List<???> computeEitherList(/* args */, Class<?> whichType)
{
/* snip */
}
Có cách nào tốt đẹp, thanh lịch để làm việc này không? Tôi đã chơi xung quanh với các phương pháp chung, nhưng tôi không thể nhìn thấy một cách để làm điều này. Ngay cả mucking về với sự phản ánh đã không nhận được tôi bất cứ nơi nào (có lẽ tôi cần một cái gì đó như TypeToken
? ... eww).
Bạn có thể quan tâm vào trang web stackexchange mới này: http://codereview.stackexchange.com/ – Mchl
@Mchl: ** Gah * * - bây giờ nó lên –