最近我阅读了很多关于使用 static
的文章。我看到了很多有人滥用 static
的情况。我想要确保我在这个 Manager 类中正确地使用了它:
public class SignManager
{
private static HashMap<String, List<GameSign>> signsBySection = new HashMap<>();
private static HashMap<String, List<GameServer>> serversBySection = new HashMap<>();
private static HashMap<String, GameServer>serverNames = new HashMap<>();
private static HashMap<Sign, GameSign> gameSignBySign = new HashMap<>();
private static List<GameServer> availableServers = new ArrayList<>();
private static List<GameServer> displayedServers = new ArrayList<>();
public static void addSign(String section, Sign sign)
{
List<GameSign> signs = signsBySection.get(section);
if(signs == null)
signsBySection.put(section, signs = new ArrayList<>());
GameSign gameSign = new GameSign(section, sign.getLocation());
signs.add(gameSign);
gameSignBySign.put(sign, gameSign);
}
public static void addServers(String section, List<String> range)
{
List<GameServer> servers = SignManager.serversBySection.get(section);
if(servers == null)
SignManager.serversBySection.put(section, servers = new ArrayList<>());
for(String s : range)
{
GameServer server = new GameServer(s);
servers.add(server);
serverNames.put(s, server);
}
}
public static void setAvailable(GameServer server)
{
availableServers.add(server);
}
public static void replaceDisplayed(GameServer old, GameServer newServer)
{
removeDisplayed(old);
displayedServers.add(newServer);
}
public static void removeDisplayed(GameServer server)
{
displayedServers.remove(server);
if(server != null)
server.setSign(null);
}
public static boolean isDisplayed(GameServer server)
{
return displayedServers.contains(server);
}
public static boolean isAvailable(GameServer server)
{
return availableServers.contains(server);
}
public static void tick()
{
for(GameSign sign : getAllGameSigns())
sign.tick();
GameSign.addDot();
}
public static GameServer getGameServer(String name)
{
return serverNames.get(name);
}
public static GameServer getNextAvailableServer()
{
if(availableServers.size() == 0)
return null;
GameServer server = availableServers.get(0);
availableServers.remove(0);
return server;
}
public static GameSign getGameSign(Sign sign)
{
return gameSignBySign.get(sign);
}
public static Set<Map.Entry<String, List<GameSign>>> getSignsBySection()
{
return signsBySection.entrySet();
}
public static Collection<GameServer> getAllServers()
{
return serverNames.values();
}
public static Collection<GameSign> getAllGameSigns()
{
return gameSignBySign.values();
}
}
我还读到,如果类具有状态,就不应该使用
static
。那么使用 static
Map 是否意味着这个类具有状态,并且我在这里使用 static
正确吗?提前感谢。
SignManager
的地方,您有一个适当的实例?难道有两个具有不同服务器等的不同SignManager
实例是不可想象的吗?(特别是这样测试会更容易...) - Jon SkeetSignManager
的实例并使其可供所有需要它的东西使用呢?这将使测试更加容易,以及未来扩展到一个不再一起保存的系统中... - Jon Skeet