一些背景:我正在解析一个会计分类账,其中account1
和account2
为int
类型。每个都是[0,99999]范围内的数字。我有很多组合需要考虑。
理想情况下,我想使用类似的东西
switch (account1, account2){
case (1,1):
/*account1 is 1, account2 is 1*/
case (2,1):
/*account1 is 2, account2 is 1*/
}
等等。 (我只需要考虑大约20种可能的组合)。
有没有办法在Java中实现这一目标?
我考虑过这个问题Storing number pairs in java
并可以建立一个IntPair
类。也许如果我定义bool equals
然后我可以在一个实例上switch
,以类似的方式你可以打开java.lang.String
。
唉,这在Java中是不可能的。您只能在Java版本7中打开整数类型或java.lang.String
。(您无法通过覆盖equals
中的hashCode
和java.lang.Object
将此功能构建到您自己的类型中)。
但这可能会激励你做一个黑客:
switch (Integer.toString(account1) + "_" + Integer.toString(account2)){
case "1_1":
case "2_1":
}
我发现这是令人惊讶的可读性。
编辑:
也许这个?
public enum Account{
ACC_512_401(512,401),
ACC_512_402(512,402);
private final int accA;
private final int accB;
Account(int accA, int accB){
this.accA=accA;
this.accB=accB;
}
private int getAccA(){
return accA;
}
private int getAccB(){
return accB;
}
public static Account getEnum(int accA, int accB){
for(Account acc : values()){
if(accA == acc.getAccA() && accB == acc.getAccB()){
return acc;
}
}
return null;
}
}
public class testswitch {
public static void main(String[] args) {
test(Account.getEnum(512, 401));
}
public static void test(Account acc){
switch (acc){
case ACC_512_401:
System.out.println("A");
break;
case ACC_512_402:
System.out.println("A");
break;
default:
break;
}
}
}
你切换你的枚举。
编辑:我添加了getEnum方法来获取int输入的值。现在这就是你想要的。
一个可能的策略就是这样,@ Morgan的回答略有不同:
public enum AccountRelationship {
BOSS_ACCOUNTS,
SECRET_SWISS_TAX_AVOIDING_ACCOUNTS,
OTHER;
}
public static final Map<AccountPair,AccountRelationship> relationships = new HashMap<>();
static {
relationships.put(new AccountPair(1,1),AccountRelationship.BOSS_ACCOUNTS);
relationships.put(new AccountPair(1,5),AccountRelationship.BOSS_ACCOUNTS);
relationships.put(new AccountPair(2,2),AccountRelationship.SECRET_SWISS_TAX_AVOIDING_ACCOUNTS);
}
public void doSomething(AccountPair pair) {
AccountRelationship rel = relationships.getOrDefault(pair, AccountRelationship.OTHER);
switch (rel) {
case BOSS_ACCOUNTS: receiveLotsOfBonus(); break;
case SECRET_SWISS_TAX_AVOIDING_ACCOUNTS: laughAllTheWayToTheBank(); break;
case OTHER: payLotsOfTaxes();
}
}
这将决定做什么与调用动作的逻辑分开,使事情更易读,更容易扩展。更不用说您可以轻松地单独测试所有内容。
正如你所看到的,它虽然很冗长。
它有另一个潜在的陷阱:relationships
地图。如果您有多个需要相同操作的帐户对,这很好,但是当您向AccountRelationship
添加新值时,很容易忘记更新此地图。
只是为了使用素数的乐趣:(它在上述范围内是安全的,但在高整数时它肯定会失败)
案例计算将在编译时完成。
public class Switch {
public static void main(String[] args) {
int i = 1;
int j = 2;
switch (i * 2 + j * 3) {
case 1 * 2 + 2 * 3:
System.out.println("match");
}
}
}