Java에서 두 개의 인수를 확인하십시오. null이 아니거나 우아하게 null입니다.


161

스프링 부트를 사용하여 이메일을 보내는 데 사용되는 쉘 프로젝트를 개발했습니다.

sendmail -from foo@bar.com -password  foobar -subject "hello world"  -to aaa@bbb.com

는 IF frompassword인수 누락, 나는 기본 발신자와 비밀번호, 예를 들어, 사용 noreply@bar.com123456.

따라서 사용자가 from인수를 전달하면 인수도 전달해야 password하며 그 반대도 마찬가지입니다. 즉, 둘 다 널이 아니거나 둘 다 널입니다.

이것을 우아하게 확인하려면 어떻게해야합니까?

이제 내 길은

if ((from != null && password == null) || (from == null && password != null)) {
    throw new RuntimeException("from and password either both exist or both not exist");
}

14
따로, 공백을주의해서 사용하면 코드를 훨씬 쉽게 읽을 수있게됩니다. 현재 코드에서 연산자 사이에 공백을 추가하면 가독성 IMO가 크게 향상됩니다.
Jon Skeet

8
"우아함"을 정의하십시오.
Renaud

SMTP 인증 자격 증명과 봉투 발신자 전자 메일 주소에 대해 별도의 인수 집합이 필요합니다. From전자 메일 주소는 항상 SMTP 인증 이름이 아닙니다.
Kaz

3
실제로 훨씬 더 최적화 할 수 없으며 읽을 수있는 코드 한 줄이며 지나치게 최적화하여 얻을 수있는 것은 없습니다.
diynevala

3
참고 사항 : 이것이 쉘 스크립트 인 경우 비밀번호가 쉘 기록에 저장되지 않습니까?
내 몸을 만지십시오

답변:


331

^( XOR ) 연산자를 사용하는 방법이 있습니다 .

if (from == null ^ password == null) {
    // Use RuntimeException if you need to
    throw new IllegalArgumentException("message");
}

if하나의 변수가 null 인 경우 조건이 true가됩니다.

그러나 일반적으로 if예외 메시지가 다른 두 가지 조건 을 사용하는 것이 좋습니다 . 단일 조건을 사용하여 무엇이 잘못되었는지 정의 할 수 없습니다.

if ((from == null) && (password != null)) {
    throw new IllegalArgumentException("If from is null, password must be null");
}
if ((from != null) && (password == null)) {
    throw new IllegalArgumentException("If from is not null, password must not be null");
}

더 읽기 쉽고 이해하기 쉬우 며 약간의 추가 입력 만하면됩니다.


152
두 bool의 xor가 두 bool보다 선호되는 이유가 !=있습니까?
Eric Lippert

1
와우, 부울의 XOR이와 동일하다는 것을 알지 못했습니다 !=. 마음을 날려. 그리고 그것은 의견에서 매우 많은 수의 공감대입니다. 그리고이 의견에 품질을 추가하기 위해 사용자는 오류를 수정하는 방법을 더 잘 알 수 있기 때문에 다른 오류 사례마다 다른 오류 메시지를 제공하는 것이 좋습니다.
justhalf

1
2 요소는 괜찮습니다. > 2 개 요소로이를 수행하는 방법은 무엇입니까?
Anushree Acharjee

요소가> 0이면 오류 메시지를 표시하고 싶습니다. 기본적으로 모두 0으로 설정되어 있습니다. 모두> 0이면 유효한 시나리오입니다. 이것을하는 방법?
Anushree Acharjee

이것은 멋진 인터뷰 질문을 할 것입니다. 프로그래머의 %가 무엇을 알고 있는지 궁금합니다. 그러나 나는 그것이 명확하지 않다는 것에 동의하지 않으며 2 if조항 으로 나뉘어 질 것을 보증하지 않습니다 . 예외의 메시지는 잘 기록되어 있습니다 (질문을 편집했지만 받아 들일 때까지 나타나지 않습니다)
Adam

286

음, 둘의 "nullity"조건이 같은지 아닌지 확인하려고하는 것 같습니다. 당신은 사용할 수 있습니다 :

if ((from == null) != (password == null))
{
    ...
}

또는 도우미 변수를 사용하여 더 명확하게 만드십시오.

boolean gotFrom = from != null;
boolean gotPassword = password != null;
if (gotFrom != gotPassword)
{
    ...
}

18
당신은 내 SO 영웅 @Kaz 중 하나이지만 '이것이나 저것은 같지만 둘 다 같지는 ^않습니다. :-)
David Bullock

6
@DavidBullock : 부울에 관해서는 "이것도 저것도 아니고 둘 다 같지 않다"는 말은 없습니다. XOR 부울에 대한 "같지 않음"함수의 또 다른 이름입니다.
Kaz

5
@Kaz ^"이봐, 내 피연산자는 부울이다"라는 말이 !=아닙니다. (하지만 불행히도 "내 피연산자가 숫자 일 수 있으며이 시점에서 관계 연산자가 아닐 수도 있습니다"를 확인해야하기 때문에이 효과는 줄어 듭니다. 나와 동의하지 않더라도 영웅 상태는 줄어들지 않습니다 :-)
David Bullock

3
문제의 요구 사항을 읽은 후 솔루션은 코드가 이해하기 쉽고 읽을 수 있습니다. 그러나 4 년의 개발자 (여전히 학교에 다니는 개발자)로서이 코드를 읽고 "비즈니스 요구 사항"이 무엇인지 파악하려고 노력하는 것은 골치 아픈 일입니다. 이 코드에서, 나는 즉시 이해하지 않는다 " frompassword반드시 모두는 null 또는 두 가지 모두 null가 아닌 수". 어쩌면 그것은 저와 저의 경험이 아니지만 @ stig-hemmer의 답변과 같이 더 읽기 쉬운 솔루션을 선호합니다. 다른 3 줄의 코드가 필요하더라도. 나는 즉시 얻지 못한다고 생각합니다 bool != bool-직관적이지 않습니다.
Chris Cirefice

2
@DavidBullock ^연산자는 비트 연산자입니다. 실제로 피연산자가 부울이라는 것을 의미하지는 않습니다. 부울 xor 연산자는 xor입니다.
Brilliand

222

개인적으로, 나는 읽기 쉽고 우아한 것을 선호합니다.

if (from != null && password == null) {
    throw new RuntimeException("-from given without -password");
}
if (from == null && password != null) {
    throw new RuntimeException("-password given without -from");
}

52
더 나은 메시지를 얻으려면 +1하십시오. 이것은 이다 , 아무도 handwaving 좋아하는 중요한 "뭔가 잘못 없다" 아무도해야하므로, -error 메시지를 일으키지 같은 메시지를. 그러나 실제로, 하나는보다 구체적인 예외를 선호한다 (특히 IllegalArgumentException대신 베어의 RuntimeException)
Marco13

6
@matt 비판은 코드가 아니라 예외 텍스트와 관련이 있습니다. 그러나이 답변의 장점은 오류 메시지의 내용이 아니라 if 문의 구조에 있다고 생각합니다. 이것은 기능성을 향상시키기 때문에 가장 좋은 대답입니다. OP는 예외 텍스트에 원하는 문자열을 쉽게 대체 할 수 있습니다.
Dan Henderson

4
@matt 장점은 두 가지 잘못된 상태 중 발생한 상태를 구별하고 오류 메시지를 사용자 정의 할 수 있다는 것입니다. 따라서 "이 두 가지 중 하나를 잘못 수행했다"고 말하는 대신 "이 작업을 수행 했음"또는 "이 작업을 수행했습니다"라고 말한 다음 원하는 경우 해결 단계를 진행할 수 있습니다. 두 경우 모두 해상도가 동일 할 수 있지만 "이러한 일 중 하나를 잘못했다"고 말하는 것은 좋은 생각이 아닙니다. 출처 :이 기능을 제공 할 수없는 환경에서 오류 텍스트의 첫 번째 조건을 만족 한 사용자의 많은 질문을했습니다.
댄 헨더슨

4
@DanHenderson> "이러한 일 중 하나를 잘못했다"고 말하는 것은 좋은 생각이 아닙니다. 동의하지 않습니다. 비밀번호 / 사용자 이름 사용자 이름과 비밀번호가 일치하지 않는다고 말하는 것이 더 안전합니다.
matt

2
@DanHenderson 보안 관점 에서, 사용자 이름이 디렉토리에있는 경우와 다른 방법으로 공격자가 유효한 사용자 이름을 찾을 수있는 경우를 구별하지 않는 것이 좋습니다 . 그러나 null / not null을 혼합하면 (이 경우) 항상 사용 오류 이며 더 자세한 오류 메시지를 표시해도 처음에 제공된 사용자보다 더 많은 정보가 누출되지 않습니다.
siegi

16

서명을 사용하여 해당 기능을 2 개의 인수 메소드에 넣으십시오.

void assertBothNullOrBothNotNull(Object a, Object b) throws RuntimeException

이를 통해 실제 실제 방법으로 공간을 절약하고 더 읽기 쉽습니다. 약간 장황한 메소드 이름에는 문제가 없으며 매우 짧은 메소드에는 문제가 없습니다.


14
공간을 절약 ((from == null) != (password == null))할 수는 없습니다. 이해하기도 매우 간단합니다. 유용한 방법이 아닌 문제가 있습니다.
edc65

3
if 문의 한 줄, throw 문의 두 번째 줄, 닫는 괄호의 세 번째 줄이 있습니다. 모두 한 줄로 바뀝니다. 닫는 중괄호에 새 줄을 추가하면 줄이 하나 더 저장됩니다!
Traubenfuchs

10
코드를 읽을 때 하나의 메소드 이름이 있고 vs 저글링을 이해해야합니다.
Traubenfuchs

1
확실히 +1이면 INTENTION을 명확하게하는 설명적인 메소드와 변수 이름을 사용하여 불완전한 구현 세부 사항과 연산자를 추상화하는 것을 선호합니다. 논리에는 버그가 포함되어 있습니다. 의견이 더 나쁘다. 메소드 이름은 의도를 표시하고 논리를 분리하므로 오류를 쉽게 찾고 수정할 수 있습니다. 이 솔루션은 (정말 중요한 일입니다) 그것은 우리가 대신 비즈니스 요구 사항에 초점을 맞출 수 있습니다, 모르거나 전혀 구문이나 논리에 대해 생각하는 독자를 필요로하지 않습니다
사라

1
여기에 설명적인 예외 메시지가 필요하면 불필요한 문제가 발생합니다.
Honza Brabec

11

Objects.isNull(Object)정적 가져 오기를 가정하면 Java 8 솔루션은을 사용합니다 .

if (isNull(from) != isNull(password)) {
    throw ...;
}

Java <8의 경우 (또는를 사용하지 않으려는 경우 Objects.isNull()) 고유 한 isNull()메소드를 쉽게 작성할 수 있습니다 .


6
마음에 들지 않습니다. from == null != password == null스택의 동일한 프레임에 모두 유지하지만 Objects.isNull(Object)불필요하게 사용하면 두 프레임이 밀리고 터집니다. Objects.isNull (Object)는 '이 메소드가 술어로 사용되기 위해 존재하기 때문에'(즉, 스트림에서) 존재합니다.
David Bullock

5
이와 같은 간단한 방법은 일반적으로 JIT에 의해 빠르게 인라인되므로 성능 영향은 거의 무시할 수 있습니다. 우리는 실제로 사용법에 대해 토론 Objects.isNull()할 수 있습니다 – 원한다면 직접 작성할 수 있습니다 – 그러나 가독성에 관한 한, 사용하는 isNull()것이 더 좋습니다. 또한 간단한 표현식을 컴파일 하려면 추가 괄호가 필요합니다 from == null != (password == null).
Didier L

2
나는 JIT에 (그리고 운영 순서는 ... 게으르다) 동의합니다. 여전히 null과 비교할 목적으로 제공된 시설(val == null) 이 너무 많기 때문에 방법이 상당히 기능적이고 인라인 가능하며 잘 작동하더라도 두 가지 큰 뚱뚱한 메서드 호출을 통해 나를 응시하는 것이 어렵다는 것을 알았습니다. 명명 된. 그래도 나야 나는 최근에 내가 이상하다고 결정했다.
David Bullock

4
솔직히 누가 단일 스택 프레임에 관심이 있습니까? 스택은 무한한 재귀를 처리하거나 사하라 사막 크기의 객체 그래프가있는 1000 계층 응용 프로그램을 사용하는 경우에만 문제가됩니다.
sara

9

다음은 여러 null 검사에 대한 일반적인 솔루션입니다.

public static int nulls(Object... objs)
{
    int n = 0;
    for(Object obj : objs) if(obj == null) n++;
    return n;
}

public static void main (String[] args) throws java.lang.Exception
{
    String a = null;
    String b = "";
    String c = "Test";

    System.out.println (" "+nulls(a,b,c));
}

용도

// equivalent to (a==null & !(b==null|c==null) | .. | c==null & !(a==null|b==null))
if (nulls(a,b,c) == 1) { .. }

// equivalent to (a==null | b==null | c==null)
if (nulls(a,b,c) >= 1) { .. }

// equivalent to (a!=null | b!=null | c!=null)
if (nulls(a,b,c) < 3) { .. }

// equivalent to (a==null & b==null & c==null)
if (nulls(a,b,c) == 3) { .. }

// equivalent to (a!=null & b!=null & c!=null)
if (nulls(a,b,c) == 0) { .. }

2
좋은 접근 방법이지만 첫 번째 "동등한"주석은 끔찍하게 잘못되었습니다 (모든 주석에 존재하는 철자 실수 이외)
Ben Voigt

@BenVoigt가 수정, 통지 주셔서 감사합니다
Khaled.K

9

발신자와 비밀번호가 모두없는 경우 특별한 작업 (기본값 사용)을 원하므로 먼저 처리하십시오.
그 후에는 전자 우편을 보낼 발신자와 암호가 있어야합니다. 둘 중 하나라도 없으면 예외를 던집니다.

// use defaults if neither is provided
if ((from == null) && (password == null)) {
    from = DEFAULT_SENDER;
    password = DEFAULT_PASSWORD;
}

// we should have a sender and a password now
if (from == null) {
    throw new MissingSenderException();
}
if (password == null) {
    throw new MissingPasswordException();
}

추가 이점은 기본값 중 하나가 null이면 감지되는 것입니다.


데, 그런 말을 일반적으로 나는 그것이 당신이 필요로하는 사업자 인 경우 XOR의 사용은 허용해야한다고 생각합니다. 그것은 이다 때문에 난해한 컴파일러 버그의 작동 언어뿐만 아니라 몇 가지 트릭의 일부.
나는 한때 삼항 연산자가 너무 혼란스러워한다는 소를 발견했습니다 ...


1
귀하의 답변 중 하나를 샘플링하여 무작위로 선택하여 약속 된 xkcd 링크를 찾을 수 없기 때문에 하향 투표했습니다! 부끄러운 줄 아세요!
dhein

@Zaibis 내 방어에서, 그것은 단지 직업이 아닌 취미 일 뿐이다. 그러나 내가 하나를 찾을 수 있는지 볼 수 있습니다 ...
SQB

8

이 코드를 실제로 작성하는 방법에 대한 다른 대안을 제안하고 싶습니다.

if( from != null )
{
    if( password == null )
        error( "password required for " + from );
}
else
{
    if( password != null )
        warn( "the given password will not be used" );
}

나에게 이것은 미래에 그것을 읽을 필요가있는 누군가를 이해하기 쉽게 만드는이 상태를 표현하는 가장 자연스러운 방법 인 것 같습니다. 또한보다 유용한 진단 메시지를 제공하고 불필요한 암호를 덜 심각하게 취급 할 수 있으며 이러한 조건에 적합한 것으로 쉽게 수정할 수 있습니다. 즉, 명령 행 인수로 비밀번호를 제공하는 것이 최선의 아이디어가 아니며 인수가 누락 된 경우 선택적으로 표준 입력에서 비밀번호를 읽도록 허용 할 수 있습니다. 또는 불필요한 암호 인수를 자동으로 무시할 수 있습니다. 이와 같은 변경으로 전체 내용을 다시 작성할 필요는 없습니다.

그 외에도 최소한의 비교 만 수행하므로 "우아한" 대안 보다 비싸지 않습니다 . 새 프로세스를 시작하는 것이 이미 추가 널 검사보다 훨씬 비싸기 때문에 성능이 문제가되지는 않습니다.


나는 다소 대화식으로 논평하기 때문에 "// 우리는 null을 가지고있다"라는 다른 문장을 따를 수 있습니다. 예제의 간결함은 이것을 아주 작게 만듭니다. 나는 논리의 명확성과 이것이 제시하는 테스트의 축소를 좋아한다.
Nate

이것은 완벽하게 작동하지만 if 문이 덜 명확하고 어수선 해 보이는 경우 중첩됩니다. 그것은 개인적인 견해 일 뿐이므로이 답변이 다른 옵션으로 제공되어 기쁘다
Kevin Wells

우아함이있는 한, 이것은 아마도 가장 우아한 방법 중 하나 일 것입니다.
dramzy

7

나는 이것을 처리하는 올바른 방법이 세 가지 상황을 고려하는 것이라고 생각합니다.

if(from != null && password != null){
    //use the provided values
} else if(from == null && password == null){
    //both values are null use the default values
} else{
   //throw an exception because the input is not correct.
}

원래의 질문이 잘못 입력되면 흐름을 끊고 싶어하는 것처럼 들리지만 나중에 논리의 일부를 반복해야합니다. 아마도 좋은 던지기 진술은 다음과 같습니다.

throw new IllegalArgumentException("form of " + form + 
    " cannot be used with a "
    + (password==null?"null":"not null") +  
    " password. Either provide a value for both, or no value for both"
);

2
이 코드는 작동하지 않기 때문에가 아니라 이해하기가 어렵 기 때문에 잘못되었습니다. 다른 사람이 작성한 그러한 종류의 코드를 디버깅하는 것은 단지 악몽입니다.
NO_NAME

2
@NO_NAME 왜 이해하기 어려운지 모르겠습니다. OP는 세 가지 경우를 제공했습니다. 양식과 암호가 모두 제공되고 둘 중 하나가 제공되지 않은 경우와 예외가 발생하는 대소 문자가 혼합 된 경우. 중간 조건을 참조하여 둘 다 null인지 확인하고 있습니까?
matt

2
@NO_NAME에 동의합니다. 중간 사례는 너무 많은 파싱이 필요합니다. 맨 위 줄을 구문 분석하지 않으면 null이 중간과 관련이 없다는 것을 알 수 없습니다. 이 경우 from 및 password의 동등성은 실제로 널이 아닌 부작용입니다.
jimm101

1
@ jimm101 네, 문제가 있음을 알 수있었습니다. 성능상 이점은보다 자세한 솔루션으로는 최소화 / 탐지 할 수 없습니다. 그게 문제인지 확실하지 않습니다. 업데이트하겠습니다.
matt

2
@matt 성능 이점이 없을 수도 있습니다. 컴파일러가 무엇을하는지,이 경우 칩이 메모리에서 무엇을 가져갈 것인지는 확실하지 않습니다. 실제로 아무 것도 산출하지 않는 최적화에서 많은 프로그래머 사이클을 태울 수 있습니다.
jimm101

6

다음은 Xor og long if와 관련이없는 비교적 간단한 방법입니다. 그러나 약간 더 장황해야하지만 거꾸로 더 의미있는 오류 메시지를 얻기 위해 제안한 사용자 지정 예외를 사용할 수 있습니다.

private void validatePasswordExists(Parameters params) {
   if (!params.hasKey("password")){
      throw new PasswordMissingException("Password missing");
   }
}

private void validateFromExists(Parameters params) {
   if (!params.hasKey("from")){
      throw new FromEmailMissingException("From-email missing");
   }
}

private void validateParams(Parameters params) {

  if (params.hasKey("from") || params.hasKey("password")){
     validateFromExists(params);
     validatePasswordExists(params);
  }
}

1
제어 흐름 설명 대신 예외를 사용해서는 안됩니다. 성능이 저하되는 것 외에도 정신 흐름을 깨뜨리기 때문에 코드의 가독성이 떨어집니다.
phu

1
@anphu 아니 그냥. 예외를 사용하면 if-else 절이 제거되고 코드 흐름이 더 명확 해 지므로 코드 가독성이 향상됩니다. docs.oracle.com/javase/tutorial/essential/exceptions/…
Arnab Datta

1
나는 당신이 정말로 예외적이고 일상적으로 발생하고 정상적인 실행의 일부로 간주 될 수있는 것을 혼란스럽게 생각합니다. java doc은 파일을 읽는 동안 메모리가 부족한 예외적 인 예를 사용합니다. 잘못된 매개 변수를 만나는 것은 예외가 아닙니다. "정상적인 제어 흐름에는 예외를 사용하지 마십시오." - blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx

첫째, 누락되거나 적절한 인수가 예외가 아닌 경우 왜 IllegalArgumentException이 존재합니까? 둘째, 당신이 진정으로 유효하지 않은 인수가 예외적이지 않다고 믿는다면, 이것의 검증도 없어야합니다. 다시 말해, 행동을 시도하고 무언가 잘못되었을 때 예외를 던지십시오. 이 방법은 괜찮지 만 여기서 제안한 방법이 아니라 여기서 말하는 성능 저하가 발생합니다. 발생했을 때 Java 예외는 느리지 않습니다. 복구하는 데 시간이 걸리는 것은 스택 트레이스입니다.
Arnab Datta

상황이 핵심입니다. OP의 컨텍스트 (Sendmail 앱)에서 사용자 이름과 비밀번호를 잊어 버리는 것이 일반적이며 일반적입니다. 미사일 유도 알고리즘에서 null 좌표 매개 변수는 예외를 발생시켜야합니다. 나는 매개 변수를 검증하지 않는다고 말하지 않았다. OP의 맥락에서, 나는 응용 로직을 구동하기 위해 예외를 사용하지 않는다고 말했다. 스택 트레이스를 푸는 것은 내가 말하고있는 성능입니다. 귀하의 접근 방식을 사용하면 결국 PasswordMissingException / FromEmailMissingException을 포착합니다. .
phu

6

아무도 삼항 연산자를 언급하지 않은 것 같습니다 .

if (a==null? b!=null:b==null)

이 특정 조건을 확인하는 데는 효과적이지만 두 변수를 지나쳐 일반화하지는 않습니다.


1
외모의 좋은,하지만 열심히보다 이해하기 ^, !=두 bools 두와 if
coolguy

@coolguy 제 생각에 삼항 연산자는 XOR 연산자보다 훨씬 흔합니다 (비트 연산을 수행하지 않는 코드에서 XOR을 볼 때마다 '정말 놀람'은 말할 것도 없습니다).이 공식은 컷을 피하는 경향이 있습니다. 더블 if를 괴롭히는 오류를 붙여 넣습니다.
gbronner

권장하지 않습니다. (a! = null && b == null)과 (a == null && b! = null)간에 차이가 없습니다. 삼항 연산자를 사용하려는 경우 :a == null ? (b == null? "both null" : "a null while b is not") : (b ==null? "b null while a is not")
Arnab Datta

5

당신의 의도를 볼 때, 항상 독점적 인 passwordnull 을 모두 검사 할 필요 from는 없지만 null이 아닌 경우 null인지 확인해야 합니다. 주어진 password인수를 무시하고 자신의 기본값을 사용할 수 있습니다from 널인 .

의사로 작성된 내용은 다음과 같아야합니다.

if (from == null) { // form is null, ignore given password here
    // use your own defaults
} else if (password == null) { // form is given but password is not
    // throw exception
} else { // both arguments are given
    // use given arguments
}

4
이것에 대한 유일한 문제는 사용자가을 제공 password하지 않고 공급할 from때 암호를 무시하려고하지만 기본 계정은 유지한다는 것입니다. 사용자가 그렇게하면 잘못된 명령이므로 알려야합니다. 프로그램은 입력이 유효한 것처럼 진행 되어서는 안되며 사용자가 지정하지 않은 암호로 기본 계정을 사용하십시오. 나는 그런 프로그램을 맹세합니다.
David Bullock

4

클래스의 필드 frompassword필드를 만들고 해당 클래스의 인스턴스에 대한 참조를 전달하는 간단한 솔루션을 언급 한 사람이 아무도 없습니다 .

class Account {
    final String name, password;
    Account(String name, String password) {
        this.name = Objects.requireNonNull(name, "name");
        this.password = Objects.requireNonNull(password, "password");
    }
}

// the code that requires an account
Account from;
// do stuff

여기 from null이거나 null이 아닐 수 있으며 null이 아닌 경우 두 필드 모두 null이 아닌 값을 갖습니다.

이 방법의 한 가지 장점은 계정을 사용하는 코드가 실행될 때가 아니라 계정을 처음 가져올 때 하나의 필드를 만들지 만 다른 필드를 null로 만드는 오류가 발생한다는 것입니다. 계정을 사용하는 코드가 실행될 때까지는 데이터가 유효하지 않습니다.

이 방법의 또 다른 장점은 더 의미적인 정보를 제공하기 때문에 더 읽기 쉽습니다. 또한 다른 장소에서 이름과 비밀번호를 함께 요구할 가능성이 있으므로 추가 클래스를 정의하는 데 드는 비용이 여러 용도로 사용됩니다.


new Account(null, null)null 이름과 암호가 모두있는 계정이 여전히 유효하더라도 NPE가 발생하기 때문에 예상대로 작동하지 않습니다 .
HieuHT

실제 이름으로 계정이 존재하는지 여부에 관계없이 이름과 비밀번호가 null 인 경우 null을 전달하는 것이 좋습니다.
Monica Monica 복원

내가 OP에서 얻는 것은 즉, 둘 다 null이 아니거나 둘 다 null입니다. 방금 이름과 비밀번호가 모두 null 인 Account 객체를 만드는 방법이 궁금합니다.
HieuHT

@HieuHT 마지막 코멘트가 불분명했습니다. 이름과 비밀번호가 null이면 null대신을 사용 합니다 Account. 당신은 통과하지 것이다 null받는 Account생성자입니다.
Monica Reinstate Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.