2011-03-14 6 views
15

제발 도와 주실 수 있습니까? 하나의 아이디어가 있지만 구현 방법을 모르겠습니다. 생성자에서 객체 생성을 중단 할 수 있습니까?

그래서 질문은 : 우리는 생성자에서 개체를 만드는 중단 할 수 즉

someCriteria 우리는 개체를 만들 수 없습니다해야 우리의 요구 사항에 응답하지 않는 대신, null을 반환해야한다면
//Code 

SomeClass someClass = new SomeClass(someCriteria); 

새로운 개체.

C#으로 구현할 수 있습니까?

+0

당신이 묻는 너 썼어? 유효하지 않은 유형은 컴파일되지 않으므로 실행할 수 없으므로 중단되지 않습니다. – MattC

+0

아직 의존성 주입에 대해서는 충분히 알지 못하지만, Ninject와 같은 프레임 워크가 생성자에 대한 호출을 가로 채고 필요할 경우 null을 반환 할 수 있는지 궁금합니다. 하지만 아마 다른 사람들이 시도하기 전에 제안하고있는 것처럼 인수를 제거하고 예외를 던질 수 있습니다. – adam0101

답변

17

가장 좋은 방법은 공장 클래스입니다하지만 클래스가 너무 작은 경우 당신은이를 사용할 수 있습니다 someCriteria 생성자 또는 경우에 유효한 유형이 아닌 경우 어떤 논리를 실패 생성자 내부

class SomeClass 
    { 
     private string _someCriteria; 

     private SomeClass(string someCriteria) 
     { 
      _someCriteria = someCriteria; 
     } 

     public static SomeClass CreateInstance(string someCriteria) 
     { 
      if (someCriteria.Length > 2) 
      { 
       return new SomeClass(someCriteria); 
      } 
      return null; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 

      // returns null 
      SomeClass someClass = SomeClass.CreateInstance("t"); 

      // returns object 
      SomeClass someClass2 = SomeClass.CreateInstance("test"); 
     } 
    } 
+0

고맙습니다. 그것은 작동합니다! – Sergey

8

someCriteria가 유효하지 않은 경우, null을 리턴하는 SomeClass의 인스턴스를 작성하는 팩토리 클래스를 사용할 수 있습니다.

+1

이것은 특히 @Jan Zyka와 결합했을 때 큰 답입니다. – corsiKa

5

유효하면 생성자 매개 변수를 확인하는 것이 일반적입니다. 그렇지 않으면 대개 예외가 발생합니다.

나는 또한 생성자 매개 변수의 유효성을 검사하는 정적 메서드를 제공하는 좋은 조언을 읽었습니다. 이렇게하면 클래스 사용자가 생성자에서 전달할 내용이 성공하는지 여부를 확인할 수 있습니다. 매개 변수가 확실하다고 확신하는 사람들 (그들은 일종의 유효성 검사를했습니다)은 생성자와 직접 연결됩니다.

개체 대신 어떤 종류의 팩토리 클래스가 사용 된 경우에도 클래스 사용자가 null을 사용하여 수행 할 작업을 고려하십시오. 이 경우 일반적으로 다음 행에서 NullPointerException이 발생합니까? 가능한 한 빨리 잘못된 것을 중지하는 것이 좋습니다.이 경우에는 예외를 throw하고 마칩니다. 그것은 null을 돌려주는 것보다 깨끗한 솔루션이며, 누군가가 정말로 원한다면 (분명히 최선의 방법은 아님) 그는 여전히이 예외를 잡을 수 있습니다 ...

+2

이것은 훌륭한 대답입니다. 특히 @bleeeah와 결합 할 때 특히 그렇습니다. – corsiKa

2

생성자에 대한 매개 변수가 유효하지 않은 경우 ArgumentException 또는 하나 자손 클래스 (예 : ArgumentOutOfRangeException).

+0

예, 'try..catch' 및 할당 된'catch'를 사용하여 과제를 마무리하십시오. 없는. –

0

불가능 직접 입력 할 수 없습니다.

예외를 throw하고 필요한 코드를 추가하여 예외를 확인하고 null을 변수에 할당 할 수 있습니다.

더 좋은 해결책은 어떤 조건이 실패 할 경우 null을 반환하는 팩토리를 사용하는 것입니다.

var someClass = SomeClassFactory.Create(someCriteria); 
if(someClass != null) 
{ 
} 
0

객체가 반환된다 (또는 예외가 발생)이라는 구조 new 보장. 따라서 블레어 (bleeeah)가 권장하는 것처럼, 공장이나 비슷한 개념을 통해 논리를 적용 할 수 있습니다.

1

가능합니다. 또 다른 방법은 객체를 만들기 전에 체크인을하는 것입니다. 좋아요.

SomeClass someClass = null; 

if (someCriteria == VALID) 
{ 
    someClass = new SomeClass(someCriteria); 
} 

희망이 있습니다.

관련 문제