Java程序组织: How can I get rid of this massive case statement?

标签 java architecture oop switch-statement

我正在创建一个程序来填充给定的语法。现在我正在对“词类”进行建模,如下所示:

public class WordDescriptor {

    public static final String noun = "N";
    public static final String plural = "p";
    public static final String nounPhrase = "h";
    public static final String usuParticipleVerb = "V";
    public static final String transitiveVerb = "t";
    public static final String intransitiveVerb = "i";
    public static final String adjective = "A";
    public static final String adverb = "v";
    public static final String conjunction = "C";
    public static final String preposition = "P";
    public static final String interjection = "!";
    public static final String pronoun = "r";
    public static final String definiteArticle = "D";
    public static final String indefiniteArticle = "I";
    public static final String nominative = "o";
    public static final String defaultTag = "?";

    private String word; // where word is one of the constants defined above.  

    public String getWord(){
        return word;
    }

    public String setWord(){
        return word;
    }

    /** For debugging only.  
     * 
     * @param s
     * @return
     */
    protected static String getKind(String s){
        if(s.equals(noun)){
            return "noun";
        }else if(s.equals(plural)){
            return "plural";
        }else if(s.equals(nounPhrase)){
            return "nounPhrase";
        }else if(s.equals(usuParticipleVerb)){
            return "usuParticipleVerb";
        }else if(s.equals(transitiveVerb)){
            return "transitiveVerb";
        }else if(s.equals(intransitiveVerb)){
            return "intransitiveVerb";
        }else if(s.equals(adjective)){
            return "adjective";
        }else if(s.equals(adverb)){
            return "adverb";
        }else if(s.equals(conjunction)){
            return "conjunction";
        }else if(s.equals(preposition)){
            return "preposition";
        }else if(s.equals(interjection)){
            return "interjection";
        }else if(s.equals(pronoun)){
            return "pronoun";
        }else if(s.equals(definiteArticle)){
            return "definiteArticle";
        }else if(s.equals(indefiniteArticle)){
            return "indefiniteArticle";
        }else if(s.equals(nominative)){
            return "nominative";
        } else if(s.equals(defaultTag)){
            return "defaultTag";
        }else{
            return "other: "+s;
        }
    }

}

这几乎是我能想象到的最丑陋的代码。我知道我可以通过使用 case 语句让它变得更好一点,但这仍然很难看。这是我的问题:

怎样才能让它变美?我在考虑制作:

  • 类 WordDescriptor,具有子类:
    • 类名词,有子类:
      • 单数
      • 复数
    • 类动词
    • 类副词

但我也不确定这是否是个好主意。我怎样才能更好地解决这个问题?


编辑:如果我确实采用了第二种方法,我什至不确定这些类会是什么样子。这是一个例子:

public abstract class WordDescriptor {

   public String toString();

}

public class Noun extends WordDescriptor {

    public String toString(){
        return "Noun";
    }
}

public class Plural extends Noun{
    public String toString(){
        return "Plural";
    }
}

最佳答案

我只想创建一个字典或从缩写到完整描述的映射。然后 getKind 将在映射中查找其输入并返回结果,如果输入未映射到任何内容,则返回 other

关于Java程序组织: How can I get rid of this massive case statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220716/

相关文章:

java - sqrt、cbrt - 如果不需要平方根或立方根,而是任意根怎么办?

java - 非继承对象的通用代码

Java:将对象突变限制在特定方法内

Java HashSet 实现设计

java - 在 primefaces 的 InputNumber 上使用自定义类型的 NumberFormatException

java - 如何使用 Guice 向 bean 注入(inject)简单的配置参数?

关于业务和 DTO 对象的 C# 业务对象架构问题

architecture - 从内存中提取一个单词需要多长时间?

architecture - 具有 LOB 应用背景的人的游戏架构

javascript - 在向 DOM 添加新元素后,如何使事件过滤器按价格排序?