JAVA中如何像Php一样使用myString['name'] = "my value"的语法?

3
在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']);

比a更:

throw new MyException(myerrors[116]);

我知道可以创建一个新的类,并抛出一个对象:

throw new MyException(ERROR_CONSTANTS.FAILED_LOGIN_ERROR);

但我更喜欢第一个(与我在Php中使用的相同)。

所以,有什么想法吗?


1
顺便提一下,你所说的“PHP”符号被称为“关联数组”。 - philfreo
一个注意事项:你应该确保用于索引数组(在Python中)或Map(在Java中)的文本不受诸如i18n/l10n之类的影响。如果文本根据语言环境等变化,你的应用程序将需要进行相当大的重写工作。 - vkraemer
4个回答

14

在Java中,你可能希望使用Map接口,比如HashMap

我认为,在第二个(错误列表)示例中,实际上应该使用枚举。当你在使用Java时,不用考虑PHP。在这种情况下,枚举更好,因为你需要一个明确定义的键列表。


4
+1. 在罗马,就要像罗马人一样。枚举类型可以为你提供静态类型检查。如果你拼错了一个枚举的名称,在编译时就能发现这个错误。而采用关联数组/映射方式,这种错误只有在运行时才会被发现。 - Laurence Gonsalves

6
你真的应该使用属性(或者更好的是ResourceBundle来抽象化属性文件)来处理这个特定的情况。
这里有一个教程,介绍如何使用。
这是一种更好的方法,因为你可以国际化(I18N)消息(如果需要),并且可以在文本文件中指定它们,而不是写在代码里(消息在文本中比在代码中更好,这样你就可以更新它们而无需重新构建)。

请采纳这个答案。对于这个特定的目的来说,它是所有答案中唯一正确的一个。 - BalusC

4
你可以使用双括号模式:
Map<String, String> map = new HashMap<String, String>() {{
    put( "login", "aaa" );
    put( "pass", "bbb" );
}};

...还有你提到的另一个例子:

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

你使用的Java版本是哪个,以获取“双括号模式”? - vkraemer
1
没有什么像“双括号模式”这样的东西。您只需创建一个HashMap的匿名子类,并在此子类的静态初始化程序中调用“put”两次即可。 - Arne Deutsch
3
它从1.1或者那个时候开始就是有效的,我相信。它所做的只是定义一个匿名类(外部大括号)和一个实例初始化器(内部大括号)。“双括号”有点误导。 - Michael Myers
所以是的,Arne说的没错(除了它是一个实例初始化器而不是静态的)。 - Michael Myers
1
在我看来,这也是一个不好的想法,因为你最终会创建HashMap的子类而不是它的实例。当你这样做时,你违反了“不要耍花招”的规则...在大多数情况下,耍花招等于糟糕。 - TofuBeer
显示剩余5条评论

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
@TofuBeer:不行,因为如果你在两层或三层架构中,你想先将异常传输到客户端,然后使用客户端的语言环境进行翻译。更高级别的代码也可能使用服务异常重新抛出,因此需要再次进行翻译等等。最好只在低级方法中使用数据,而不要尝试在那里执行UI操作。 - mhaller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接