+1 для this answer
Кроме того, я хотел бы предложить следующую реализацию с использованием полиморфизма:
Таким образом, вы можете добавить новую платформу проще за счет уменьшения связи между классами.
Код клиента:
Desktop desktop = Desktop.getDesktop();
desktop.open(aFile);
desktop.imaginaryAction(aFile);
В Desktop осущ:
package your.pack.name;
import java.io.File;
public class Desktop{
// hide the constructor.
Desktop(){}
// Created the appropriate instance
public static Desktop getDesktop(){
String os = System.getProperty("os.name").toLowerCase();
Desktop desktop = new Desktop();
// This uf/elseif/else code is used only once: here
if (os.indexOf("windows") != -1 || os.indexOf("nt") != -1){
desktop = new WindowsDesktop();
} else if (os.equals("windows 95") || os.equals("windows 98")){
desktop = new Windows9xDesktop();
} else if (os.indexOf("mac") != -1) {
desktop = new OSXDesktop();
} else if (os.indexOf("linux") != -1 && isGnome()) {
desktop = new GnomeDesktop();
} else if (os.indexOf("linux") != -1 && isKde()) {
desktop = new KdeDesktop();
} else {
throw new UnsupportedOperationException(String.format("The platform %s is not supported ",os));
}
return desktop;
}
// default implementation :(
public void open(File file){
throw new UnsupportedOperationException();
}
// default implementation :(
public void imaginaryAction(File file ){
throw new UnsupportedOperationException();
}
}
// One subclass per platform below:
// Each one knows how to handle its own platform
class GnomeDesktop extends Desktop{
public void open(File file){
// Runtime.getRuntime().exec: execute gnome-open <file>
}
public void imaginaryAction(File file){
// Runtime.getRuntime().exec:gnome-something-else <file>
}
}
class KdeDesktop extends Desktop{
public void open(File file){
// Runtime.getRuntime().exec: kfmclient exec <file>
}
public void imaginaryAction(File file){
// Runtime.getRuntime().exec: kfm-imaginary.sh <file>
}
}
class OSXDesktop extends Desktop{
public void open(File file){
// Runtime.getRuntime().exec: open <file>
}
public void imaginaryAction(File file){
// Runtime.getRuntime().exec: wow!! <file>
}
}
class WindowsDesktop extends Desktop{
public void open(File file){
// Runtime.getRuntime().exec: cmd /c start <file>
}
public void imaginaryAction(File file){
// Runtime.getRuntime().exec: ipconfig /relese /c/d/e
}
}
class Windows9xDesktop extends Desktop{
public void open(File file){
//Runtime.getRuntime().exec: command.com /C start <file>
}
public void imaginaryAction(File file){
//Runtime.getRuntime().exec: command.com /C otherCommandHere <file>
}
}
Это всего лишь пример, в реальной жизни не стоит, чтобы создать новый класс только параметризуем значение (командная строка% s). Но давайте предположим, что каждый метод выполняет другие шаги определенным образом на платформе.
Выполнение такого подхода может привести к удалению ненужных конструкций if/elseif/else, которые со временем могут привести к ошибкам (если в коде есть 6, а изменение необходимо, вы можете забыть обновить один из них, или путем копирования/вставки вы можете забыть изменить команду для выполнения)
Примечание: источник Program.java находится здесь http://kickjava.com/src/org/eclipse/swt/program/Program.java.htm. Может быть, это тоже может помочь – VonC 2008-11-28 09:15:13
Возможно, это очень полезно для пользователей Java 1.5 + SWT. Но использование SWT только для этого может оказаться не оптимальным. – asalamon74 2008-11-28 21:26:00