大多数人都了解enum
为计划带来的与int
或String
相关的天赋好处。如果您不知道,请参阅here和here。无论如何,我遇到了一个问题,我想要解决的问题与使用int
或String
表示常量而不是使用enum
在同一个游戏领域。这特别涉及String.format(...)。
使用String.format,程序错误似乎有一个很大的开口,即在编译时找不到 。这可能使修复错误更复杂和/或花费更长时间。
这是我打算修复(或破解解决方案)的问题。我走近了,但我还不够近。对于这个问题,这肯定是过度设计的。我理解这一点,但我只想找到一个很好的编译时解决方案,它提供最少量的样板代码。
我正在编写一些非生产代码,只是为了编写具有以下规则的代码。
可读性非常重要
然而,最简单的方法是首选。
我在跑...
我的解决方案使用与enums
相同的想法。您应该在任何时候使用枚举类型来表示一组固定的常量...数据集,您可以在编译时知道所有可能的值(docs.oracle.com)。 String.format
中的第一个参数似乎符合该法案。您事先知道整个字符串,并且可以将其拆分为多个部分(或仅一个部分),因此它可以表示为一组固定的“常量”。
顺便说一下,我的项目是一个简单的计算器,你可能已经在网上看到了 - 2个输入数字,1个结果和4个按钮(+, - ,×和÷)。我还有第二个重复计算器只有1个输入数字,但其他一切都是相同的
public enum Expression implements IExpression {
Number1 ("%s"),
Operator (" %s "),
Number2 ("%s"),
Result (" = %s");
protected String defaultFormat;
protected String updatedString = "";
private Expression(String format) { this.defaultFormat = format; }
// I think implementing this in ever enum is a necessary evil. Could use a switch statement instead. But it would be nice to have a default update method that you could overload if needed. Just wish the variables could be hidden.
public <T> boolean update(T value) {
String replaceValue
= this.equals(Expression.Operator)
? value.toString()
: Number.parse(value.toString()).toString();
this.updatedString = this.defaultFormat.replace("%s", replaceValue);
return true;
}
}
...和...
public enum DogeExpression implements IExpression {
Total ("Wow. Such Calculation. %s");
// Same general code as public enum Expression
}
IExpression.java - 这是一个巨大的问题。如果没有这个问题,我的解决方案无法正常工作!!
public interface IExpression {
public <T> boolean update(T Value);
class Update { // I cannot have static methods in interfaces in Java 7. Workaround
public static String print() {
String replacedString = "";
// for (Expression expression : Expression.values()) { // ISSUE!! Switch to this for Expression
for (DogeExpression expression : DogeExpression.values()) {
replacedString += expression.updatedString;
}
return replacedString;
}
}
}
使用IExpression.java
,这不得不入侵使用Java 7.我觉得Java 8对我来说会更好。 但是,我遇到的问题是 paramount 让我当前的实施工作问题是IExpression
不知道要迭代哪个enum
。所以我必须评论/取消注释代码才能让它立即运行。
如何解决上述问题?
答案 0 :(得分:1)
这样的事情怎么样:
public enum Operator {
addition("+"),
subtraction("-"),
multiplication("x"),
division("÷");
private final String expressed;
private Operator(String expressed) { this.expressed = expressed; }
public String expressedAs() { return this.expressed; }
}
public class ExpressionBuilder {
private Number n1;
private Number n2;
private Operator o1;
private Number r;
public void setN1(Number n1) { this.n1 = n1; }
public void setN2(Number n2) { this.n2 = n2; }
public void setO1(Operator o1) { this.o1 = o1; }
public void setR(Number r) { this.r = r; }
public String build() {
final StringBuilder sb = new StringBuilder();
sb.append(format(n1));
sb.append(o1.expressedAs());
sb.append(format(n2));
sb.append(" = ");
sb.append(format(r));
return sb.toString();
}
private String format(Number n) {
return n.toString(); // Could use java.text.NumberFormat
}
}