我正在创建一个安全的,编译时的String.format(...)等价物。一个问题仍然存在

时间:2014-07-20 11:16:30

标签: java enums abstract abstraction string.format

大多数人都了解enum为计划带来的与intString相关的天赋好处。如果您不知道,请参阅herehere。无论如何,我遇到了一个问题,我想要解决的问题与使用intString表示常量而不是使用enum在同一个游戏领域。这特别涉及String.format(...)。

使用String.format,程序错误似乎有一个很大的开口,即在编译时找不到 。这可能使修复错误更复杂和/或花费更长时间。

这是我打算修复(或破解解决方案)的问题。我走近了,但我还不够近。对于这个问题,这肯定是过度设计的。我理解这一点,但我只想找到一个很好的编译时解决方案,它提供最少量的样板代码。

我正在编写一些非生产代码,只是为了编写具有以下规则的代码。

  • 抽象是关键。
  • 可读性非常重要

  • 然而,最简单的方法是首选。

我在跑...

  • Java 7 / JDK 1.7
  • Android Studio 0.8.2

这些不令人满意

我的解决方案

我的解决方案使用与enums相同的想法。您应该在任何时候使用枚举类型来表示一组固定的常量...数据集,您可以在编译时知道所有可能的值(docs.oracle.com)。 String.format中的第一个参数似乎符合该法案。您事先知道整个字符串,并且可以将其拆分为多个部分(或仅一个部分),因此它可以表示为一组固定的“常量”。

顺便说一下,我的项目是一个简单的计算器,你可能已经在网上看到了 - 2个输入数字,1个结果和4个按钮(+, - ,×和÷)。我还有第二个重复计算器只有1个输入数字,但其他一切都是相同的

Enum - Expression.java& DogeExpression.java

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 。所以我必须评论/取消注释代码才能让它立即运行。

如何解决上述问题?

1 个答案:

答案 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 
    }
}