【问题标题】:Using an argument as an interface item使用参数作为接口项
【发布时间】:2018-07-10 07:43:53
【问题描述】:

在我正在制作的程序中,我试图获取给定季节的格式化季节名称(格式化为它。我将格式化名称保留在界面中,因为如果我要使用地图,那将是不必要的重新生成,因为我没有创建 TeamBuilder 的实例

四季界面:

public interface Seasons {
    /*
     * Contains a formatted list of seasons.
     * 
     * An interface is being used as an alternative to using a Map in the 
     * TeamBuilder class,  since calling parseTeam would have to build 
     * mappings for the seasons each time it
     * was called. This way, the formatted name can simply be grabbed
     */
    final String Skyrise = "Skyrise";
    final String Toss_Up = "Toss%20Up";
    final String Sack_Attack = "Sack%20Attack";
    final String GateWay = "Gateway";
    final String Round_Up = "Round%20Up";
    final String Clean_Sweep = "Clean%20Sweep";
    final String Elevation = "Elevation";
    final String Bridge_Battle = "Bridge%20Battle";
    final String Nothing_But_Net = "Nothing%20But%20Net";
    final String Starstruck = "Starstruck";
    final String In_The_Zone = "In%20The%20Zone";
    final String Turning_Point = "Turning%20Point";
}

当我试图抓住这些季节时,问题就来了。我的 TeamBuilder 类接受一个未格式化的参数(字符串季节)。 我的问题是,有什么方法可以使用 String 参数作为方法从接口获取特定项目?这比使用 HashMap 更可取,因为它会不必要地重新生成相同的信息

所有这些课程都可以在该项目的Github 页面上找到。

【问题讨论】:

  • 为什么 HashMap 会重新生成任何东西?
  • 如果“格式化”是指“url-escaped”,则应该使用库来执行此操作,而不是保留单独的常量列表。
  • 你为什么不直接使用枚举?
  • @StriplingWarrior 我可以使用哪个库?
  • 怎么样:String encodedUrl = URLEncoder.encode(string, "UTF-8"); stackoverflow.com/questions/24229660/…stackoverflow.com/questions/724043/…

标签: java


【解决方案1】:

如果您想以键入的方式执行此操作,可以使用 Enum:

enum Season{
    Skyrise,Toss_Up, Sack_Attack;

    @Override
    public String toString() {
        switch(this){
            case Skyrise: return "Skyrise";
            case Toss_Up: return "Toss%20Up";
            case Sack_Attack: return "Sack_Attack";
            default: return "";
        }
    }
}
public class main{
    public static void printSeason(Seasons seasons){
        System.out.println(seasons);
    }
    public static void main(String[] args) {
        Seasons e = Seasons.Skyrise;
        printSeason(e);
        System.out.println(e);
    }
}

由于编译器在内部调用 toString(),因此您可以像我的示例一样将参数作为季节或字符串传递。


如果您仍然想在没有“不必要地重新生成”的情况下使用地图,您可以使用带有静态初始化程序的静态字段,如下所示:

class Seasons {
    private static Map<String,String> map = new HashMap<>();
    static {
        map.put("Skyrise", "Skyrise");
        map.put("Toss_Up", "Toss%20Up");
    }
    public static String getFormatted(String key){
        return map.getOrDefault(key,"");
    }
}
class main{
    public static void main(String[] args) {
        System.out.println(Seasons.getFormatted("Skyrise"));
    }
}

【讨论】:

  • 可能最好将属性直接添加到枚举中,而不是将其放在开关中。
  • 谢谢,我差点忘了我们可以在枚举中使用属性
【解决方案2】:

只是为了集成 Snoob 答案,您可以使用字段枚举,所以:

enum Season
{
   Skyrise("Skyrise"),
   Toss_Up("Toss%20Up"), 
   Sack_Attack("Sack%20Attack")

   ;

   public final String fancyName;

   private Season(String fancyName)
   {
     this.fancyName = fancyName;
   }
}

你真的拥有所有的好处,没有任何缺点。

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多