嘿,我有这两种方法:
private void sendMessage(String message) {
ArrayList<Client> waiters = this.getPlayers().getWaitingRoom();
for (Client c : waiters) {
c.sendMessage(message);
}
}
第二种方法:
private void sendMessage(String message) {
ArrayList<Client> players = this.getPlayers().getGame();
for (Client c : players) {
c.sendMessage(message);
}
}
这些方法很有用,因为我需要以某种方式向等待室中的客户端和游戏中的客户端发送消息,游戏中的客户端不应该听到我为游戏中的客户端发送的消息。候车室,对面也一样。
我想出了这个解决方案,将其变成一种方法,但我觉得这是一个非常糟糕的解决方案:
private void sendMessage(String message, int type) {
ArrayList<Client> clients = (type == 0) ? this.getPlayers().getWaitingRoom() :
this.getPlayers().getGame();
for (Client c :clients) {
c.sendMessage(message);
}
}
这可行,但我想知道是否有适当的解决方案,更面向对象。但由于它使用相同的类型(ArrayList),我有点困惑和迷失。
对此方法有更好的设计想法吗?
最佳答案
第一个明显的概括是声明
private void sendMessage(String message, Iterable<? extends Client> clients) {
for (Client c : clients) {
c.sendMessage(message);
}
}
允许调用
sendMessage("Message", this.getPlayers().getWaitingRoom());
sendMessage("Message", this.getPlayers().getGame());
顺便说一句:虽然 ArrayList
的明确声明通常是没有必要的。他们可以返回 List<Client>
....
编辑:回答问题“为什么可迭代...”:
Iterable 是足以完成您想要在此方法中执行的任务的“最小”接口(interface)。您只想迭代所有元素。您不需要 ArrayList。您不需要列表。您甚至不需要集合。你只需要可迭代的东西。
优点是可以使用许多不同的参数调用此方法:
Set<Client> set = ...
List<Client> list = ...
Queue<Client> queue = ...
sendMessage("Message", set); // Works
sendMessage("Message", list); // Works
sendMessage("Message", queue ); // Works
Set<SomeClassExtendingClient> setWithSpecialClients = ...
sendMessage("Message", setWithSpecialClients); // Works as well...
如果您声明该方法接收 ArrayList<Client>
,您无法传入 LinkedList<Client>
,或 ArrayList<SpecialClient>
。与Iterable<? extends Client>
,您拥有最大可能的灵 active 。
关于Java 防止出于不同目的的方法重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21392235/