Java 我正在制作一个安全的编译时String.format(…)等价物。一个问题仍然存在

Java 我正在制作一个安全的编译时String.format(…)等价物。一个问题仍然存在,java,enums,abstract,abstraction,string.format,Java,Enums,Abstract,Abstraction,String.format,与使用int或String相比,大多数人理解enum为程序带来的先天优势。看看,如果你不知道的话。不管怎样,我遇到了一个我想解决的问题,这种问题与使用int或String来表示常量而不是使用enum是在同一个竞技场上解决的。这专门处理String.format(…) 对于String.format,似乎有一个很大的开口,用于编译时找不到的编程错误。这会使修复错误更加复杂和/或花费更长的时间 这是我着手解决的问题(或破解解决方案)。我离得很近,但还不够近。对于这个问题,这肯定是设计过度了。我理解这

与使用
int
String
相比,大多数人理解
enum
为程序带来的先天优势。看看,如果你不知道的话。不管怎样,我遇到了一个我想解决的问题,这种问题与使用
int
String
来表示常量而不是使用
enum
是在同一个竞技场上解决的。这专门处理String.format(…)

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

这是我着手解决的问题(或破解解决方案)。我离得很近,但还不够近。对于这个问题,这肯定是设计过度了。我理解这一点,但我只是想找到一个好的编译时解决方案,提供最少的锅炉板代码

我写了一些非生产性代码,只是为了按照以下规则编写代码

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

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

我在跑

  • Java7/JDK1.7
  • Android Studio 0.8.2
这些都不能令人满意
我的解决方案 我的解决方案使用了与枚举相同的思想。在需要表示一组固定常量的任何时候,都应该使用枚举类型…在编译时知道所有可能值的数据集()。
String.format
中的第一个参数似乎符合这个要求。您事先知道整个字符串,可以将其拆分为几个部分(或仅一个),因此可以将其表示为一组固定的“常量”

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

Enum-Expression.java和DogeExpression.java 当前问题 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{
公共布尔更新(T值);
类更新{//Java 7中的接口中不能有静态方法。解决方法
公共静态字符串打印(){
字符串替换字符串=”;
//for(Expression:Expression.values()){//ISSUE!!切换到此for Expression
for(DogeExpression表达式:DogeExpression.values()){
replacedString+=expression.updatedString;
}
返回替换字符串;
}
}
}
那么,为什么这是一个问题 使用
IExpression.java
,必须对其进行黑客攻击才能使用java 7。我觉得java 8对我来说会玩得更好。然而,我面临的问题是,要使我当前的实现正常工作,最重要的是
IExpression
不知道迭代哪个
enum
。因此我必须注释/取消注释代码才能使其立即工作


如何解决上述问题???

类似这样的问题如何:




我读了两遍你的问题,想回答,但我懒得复制这么多代码并尝试。你是否可以创建一个示例项目来说明你的问题?最好是maven项目。这种方法实际上比使用
String.format
要差得多,因为
Number1
操作符
e> Number2和
结果
是全局状态。您不能用此代码同时构建两个字符串,这意味着可重入性和线程化已不存在。此外,您需要为每个格式字符串编写一个全新的类,其中包含大量的样板文件。它甚至不提供任何额外的类型安全性,而且您仍然可以将写入操作搞砸g
%s
在编译器没有注意到的情况下在枚举中。我很抱歉这么说,但我认为您的设计从根本上被破坏了。当我试图修复此代码中的问题时,我得到了一个非常笨拙的字符串连接的重新实现。与
num1+“”+operator.getSign()+“”+num2+“=”相比,实际上没有任何优势+total
。调用站点复杂性的任何明显降低都是由于复杂性被转移到了一个不可重用的
表达式
类。没有一个比字符串连接更安全。尝试添加编译时安全性会导致整个过程成为字符串连接的包装器。很抱歉,这种方法它可怕、不可行,而且比它试图解决但未能解决的小问题复杂得多。不要这样做。没有答案,但FindBugs Eclise插件捕捉到了这些错误
public enum DogeExpression implements IExpression {

    Total   ("Wow. Such Calculation. %s");

    // Same general code as public enum Expression

}
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;
        }

    }

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