基本上我想要的是一个 JComboBox 来包含我已添加到我的应用程序中的加密算法列表。当用户从 JComboBox 中选择一个时,所选算法将存储在一个变量中。
我对目前实现这一目标的设置并不满意......
我有一个接口算法如下:
public interface Algorithm {
public String encrypt(String text, Object[] key);
public String decrypt(String text, Object[] key);
}
然后,我制定了实现此接口的特定算法并覆盖这些方法,例如:
public class CaesarCipher implements Algorithm {
@Override
public String encrypt(String text, Object[] key) {
...
}
@Override
public String decrypt(String text, Object[] key) {
...
}
}
现在在我的 GUI 中,我有一个变量和 JComboBox,如下所示:
private Algorithm selectedAlgorithm;
private JComboBox algorithmsComboBox;
我希望 JComboBox 列出我添加的所有不同算法,但我不知道这样做的正确方法......
所以我做了一个这样的枚举:
public enum AlgorithmType {
CAESAR_CIPHER("Caesar Cipher", new CaesarCipher());
private final String name;
private final Algorithm algorithm;
private AlgorithmType(String name, Algorithm algorithm) {
this.name = name;
this.algorithm = algorithm;
}
public Algorithm getAlgorithm() {
return algorithm;
}
@Override
public String toString() {
return name;
}
}
然后与我的 JComboBox 一起使用,我做了这样的事情:
JComboBox<AlgorithmType> algorithmsComboBox = new JComboBox<AlgorithmType>(AlgorithmType.values());
我向我的 JComboBox 添加了一个 ActionListener 以将 selectedAlgorithm 变量设置为所选算法:
algorithmsComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectedAlgorithm = ((AlgorithmType)algorithmComboBox.getSelectedItem()).getAlgorithm();
}
});
这可行,但我不确定将这样的对象存储在枚举中是否是一种好习惯,因为所有对象都是在枚举加载时不必要地创建的。有没有更好、更典型的方法来做到这一点?我可以想到一些替代方案,例如将每个算法存储在最终数组中,或者创建一个 AlgorithmFactory?或者,也许我不应该为每个算法创建单独的类,而只拥有一个算法类,它将 AlgorithmType 作为加密和解密方法的参数?
谢谢。