Java 防止出于不同目的的方法重复

标签 java oop design-patterns

嘿,我有这两种方法:

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/

相关文章:

c++ - 具有自定义数据结构的 C++ 中的运算符<<

javascript - 如何在文件中组织 OO js 代码?本地网络应用

java - 当实现仅在一个方法上不同时,建议使用哪种设计模式?

ruby-on-rails - Rails 静态数据集

c# - 不使用 IP 识别机器

java - 将@Value注入(inject)到导入的第三个jar中的bean中

Java 对象范围,从方法引用

java - Apache Tomcat 启动失败,找不到 SAXParserFactoryImpl

java - JDK中是否包含jdbc api?

c++ - LLVM 是避免动态转换规则的异常(exception)吗?