【问题标题】:JAVA myString['name'] = "my value"; (like in Php)JAVA myString['name'] = "我的价值"; (就像在 PHP 中一样)
【发布时间】:2010-12-26 22:13:59
【问题描述】:

在 PHP 中我真的经常使用这个:

$conn_sets = array();
$conn_sets['login'] = "aaa";
$conn_sets['pass'] = "bbb";

如何在 JAVA 1.6 中做同样的事情。 我试着这样做:

private method1() {    
    String[] mystring = new String[] {"login" => "aaa", "pass" => "bbb"};
}

但这给了我一个错误。 我想让这个工作,因为我有一个错误列表声明,最好识别:

throw new MyException(myerrors['failed_login_error']);

比一个:

throw new MyException(myerrors[116]);

我知道我可以做一个新类,然后抛出一个对象:

throw new MyException(ERROR_CONSTANTS.FAILED_LOGIN_ERROR);

但我更喜欢第一个(和我在 Php 中使用的一样)。

那么,有什么想法吗?

【问题讨论】:

  • 顺便说一句,您的“PHP”表示法称为“关联数组”。
  • 一个注意事项:您应该确保用于索引到您的数组(在 Python 中)或 Map(在 Java 中)的文本不受 i18n/l10n 之类的影响...如果文本会根据语言环境等发生变化,您的应用将需要进行相当大的重写。

标签: java associative-array


【解决方案1】:

在 Java 中,您可能希望使用 Map interface,例如 HashMap

虽然,我会说使用Enum 实际上是您在第二个(错误列表)示例中应该做的事情。当您使用 Java 时,忘掉 PHP。在这种情况下,枚举要好得多,因为您需要一个明确定义的键列表。

【讨论】:

  • +1。在罗马做到入乡随俗。枚举为您提供静态类型检查。如果你拼错了枚举的名称,你会在编译时知道。使用关联数组/映射方法,这种错误会在运行时困扰您。
【解决方案2】:

你可以使用双括号模式:

Map<String, String> map = new HashMap<String, String>() {{
    put( "login", "aaa" );
    put( "pass", "bbb" );
}};

...和你的另一个例子:

throw new MyException( myErrors.get( "failed_login_error" ) );

【讨论】:

  • 您使用哪个版本的 Java 来获取“双括号模式”?
  • 没有什么能比得上“双括号模式”了。您只需创建一个 HashMap 的匿名子类,并在该子类的静态初始化程序中调用两次“put”。
  • 我相信它从 1.1 左右开始就有效了。它所做的只是定义一个带有实例初始化程序(内大括号)的匿名类(外大括号)。 “双括号”有点误导。
  • 所以,是的,Arne 所说的(除了它是实例初始化器而不是静态初始化器)。
  • IMO 这也是一个坏主意,因为您最终创建了 HashMap 的子类而不是它的实例。当你这样做时,你也违反了“不要狡猾”的规则......在大多数情况下,狡猾 == 不好。
【解决方案3】:

对于这种特殊情况,您确实应该使用 Properties(或者更好的是 ResourceBundle 来抽象属性文件)。

这里是tutorial 的用法。

这是一种更好的方法,因为您可以国际化 (I18N) 消息(如果需要),并且可以在文本文件中而不是在代码中指定它们(消息在文本中比在代码中好得多,因此您可以更新无需重建)。

【讨论】:

  • OP:接受这个答案。对于这个特定目的,它是唯一正确的。
【解决方案4】:

您不想使用HashMapProperties 对象来存储广泛命名的参数。您真的想考虑面向对象并使用类来封装帐户的数据并表达对象在现实世界中真正代表的内容:

String username = "aaa";
String password = "bbb";
Account acc = new Account(username,password);
if (!tryLogin(acc)) {
 throw new LoginFailedException(account);
}

这样,捕获LoginFailedException 的客户端可以利用这些信息并使用具有良好名称的静态类型方法来例如通过调用loginFailedException.getUsername() 来检索用户名。

【讨论】:

  • LoginFailedException 中的消息可能来自属性文件...
  • @TofuBeer:不,因为如果您处于两层或三层架构中,您希望先将异常传输到客户端,然后使用客户端的语言环境进行翻译。高层代码也可能使用服务异常重新抛出,因此需要再次翻译它等等。最好只在低级方法中使用数据,而不是尝试在那里执行 UI 的东西。
猜你喜欢
  • 2014-03-06
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多