saf*_*ari 10 java android boolean switch-statement
我正在尝试创建一个方法来检查Login(用户名和密码)是否至少有6个字符.
要意识到我创建了这个方法public void checkLoginData(final String username, final String password).在那个方法中,我创建了booleans(用户和pass),我可以创建4个不同的布尔链:
现在我想为每个人做一个转换/案例请求,但我不明白如何实现......
如果你问为什么我需要切换,我只是认为我需要它,因为我想为这4个布尔链中的每一个做,它会/显示不同的东西.此外,我想以性感的方式做到这一点,而不是数以千计的不同'ifs':P,请帮忙!
这是方法的代码:
public void checkLoginData(final String username, final String password){
boolean user, pass;
if (username.length() < 6){
user = false;
}else {
user = true;
}
if (password.length() < 6){
pass = false;
}else {
pass = true;
}
boolean[] logindaten = {user, pass};
}
Run Code Online (Sandbox Code Playgroud)
Thx提前帮助!
最好的问候野生动物园
use*_*421 12
如果你真的想要一个"性感的java方式"(但这取决于你理解的那样),你可以做类似的事情(需要Java 7):
boolean user, pass;
switch (user + "-" + pass) {
case "false-false":
...
case "false-true":
...
case "true-false":
...
case "true-true":
...
default:
throw new RuntimeException(
"something strange happening here, user: " + user + ",pass: " + pass);
}
Run Code Online (Sandbox Code Playgroud)
但我更愿意只用他自己的消息做两个不同的检查,消息被加入进行演示.(并且不确定这是否可以被认为是"性感的java方式",更像是"解决方法")
您无法切换boolean[],只能在整数类型上切换.要将布尔值转换为int,您可以为2个布尔值使用位掩码,例如:
int val = 0;
if (user) val |= 0x1;
if (pass) val |= 0x2;
switch (val) {
case 0: // Both too short
case 1: // User Ok, pass too short
case 2: // User too short, pass ok
case 3: // Both Ok
}
Run Code Online (Sandbox Code Playgroud)
基本上没有比这更简单的方法,并且没有办法在明显更少的代码行中完成它.
if (username.length() < 6){
if (password.length() < 6){
// do case 1
} else {
// do case 2
}
} else {
if (password.length() < 6){
// do case 3
} else {
// do case 4
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这使得这是最好的解决方案.
此外,我想用性感的java方式做到这一点,而不是成千上万的不同'ifs'
如果用"sexy-java-way"表示"聪明"或"模糊",那么还有其他方法可以做到.但它们肯定不会使代码更易于阅读/更易于维护.
顺便说一下,上面只涉及3 ...这是正确的三个 ... if陈述.
但是你的(最终)具体例子:
public void checkLoginData(final String username, final String password){
boolean user, pass;
if (username.length() < 6){
user = false;
}else {
user = true;
}
if (password.length() < 6){
pass = false;
}else {
pass = true;
}
boolean[] logindaten = {user, pass};
....
}
Run Code Online (Sandbox Code Playgroud)
可以简化为以下内容:
public void checkLoginData(final String username, final String password){
boolean user = username.length() >= 6;
boolean pass = password.length() >= 6;
boolean[] logindaten = {user, pass};
....
}
Run Code Online (Sandbox Code Playgroud)
请注意,这里可以进行简化,因为操作(假设开关中的"case")可以重构为简单的布尔赋值,并且测试实际上彼此独立.一般来说,你不能这样做......
...但我喜欢让它更能让我的老板印象深刻;)
说真的,如果我是你的老板,你写这样的代码,我会成为联合国人留下深刻的印象.任何认为你聪明地编写模糊和不可维护代码的老板都是无能为力的.
猜猜我会如何用枚举来解决它:
public class LoginController
{
private void login( String username, String password )
{
LoginState state = determineLoginState( username, password );
switch ( state )
{
case LOGIN_OK:
//Do Something
break;
case USERNAME_FALSE:
//Do Something
break;
case PASSWORD_FALSE:
//Do Something
break;
case BOTH_FALSE:
//Do Something
break;
}
}
private LoginState determineLoginState( String username, String password )
{
final boolean checkUsername = checkUsername( username );
final boolean checkPassword = checkPassword( password );
if ( checkUsername && checkPassword )
return LoginState.LOGIN_OK;
if ( !checkUsername && checkPassword )
return LoginState.USERNAME_FALSE;
if ( checkUsername && !checkPassword )
return LoginState.PASSWORD_FALSE;
if ( !checkUsername && !checkPassword )
return LoginState.BOTH_FALSE;
throw new AuthenticationException();
}
protected boolean checkUsername( String username )
{
return username.length() > 6;
}
protected boolean checkPassword( String password )
{
return password.length() > 6;
}
private enum LoginState
{
LOGIN_OK, USERNAME_FALSE, PASSWORD_FALSE, BOTH_FALSE;
}
public class AuthenticationException extends RuntimeException
{
}
}
Run Code Online (Sandbox Code Playgroud)
if (user) {
if (pass) {
// user = true, pass = true
} else {
// user = true, pass = false
}
} else {
if (pass) {
// user = false, pass = true
} else {
// user = false, pass = false
}
}
Run Code Online (Sandbox Code Playgroud)
或者
int case = user ? (pass ? 1 : 2) : (pass ? 3: 4);
switch (case) {
case 1:
System.out.println(" user = true, pass = true ");
break;
case 2:
System.out.println(" user = true, pass = false ");
break;
case 3:
System.out.println(" user = false, pass = true ");
break;
case 4:
System.out.println(" user = false, pass = false ");
break;
}
}
Run Code Online (Sandbox Code Playgroud)