javaのchar配列は、javaのaString
にすぎません。Java7のスイッチケースで文字列を使用できますが、比較の効率はわかりません。
char配列の最後の要素だけが意味を持っているように見えるので、それを使ってswitchcaseを実行できます。何かのようなもの
private static final int VERSION_INDEX = 3;
...
char[] version = // get it somehow
switch (version[VERSION_INDEX]) {
case '5':
break;
// etc
}
...
より多くのオブジェクト指向バージョンを編集します。
public interface Command {
void execute();
}
public class Version {
private final Integer versionRepresentation;
private Version (Integer versionRep) {
this.versionRepresentation = versionRep;
}
public static Version get(char[] version) {
return new Version(Integer.valueOf(new String(version, "US-ASCII")));
}
@Override
public int hashCode() {
return this.versionRepresentation.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Version) {
Version that = (Version) obj;
return that.versionRepresentation.equals(this.versionRepresentation);
}
return false;
}
}
public class VersionOrientedCommandSet {
private final Command EMPTY_COMMAND = new Command() { public void execute() {}};
private final Map<Version, Command> versionOrientedCommands;
private class VersionOrientedCommandSet() {
this.versionOrientedCommands = new HashMap<Version, Command>();
}
public void add(Version version, Command command) {
this.versionOrientedCommands.put(version, command);
}
public void execute(Version version) throw CommandNotFoundException {
Command command = this.versionOrientedCommands.get(version);
if (command != null) {
command.execute();
} else {
throw new CommandNotFoundException("No command registered for version " + version);
}
}
}
// register you commands to VersionOrientedCommandSet
char[] versionChar = // got it from somewhere
Version version = Version.get(versionChar);
versionOrientedCommandSet.execute(version);
多くのコードheheウォームアップには少しコストがかかりますが、プログラムを複数回実行すると、マップで効率が向上します:P