2016-07-11 1 views
0

가 그들이 인터페이스로 표시하기 때문에이 문제는 특히 객체를 생성하는 방법을 것 같은자바 annotaion

private ISource source; 

public ISource getSource() { 
    return source == null ? source = ... : source; 
} 

private IProduct product; 

public IProduct getProduct() { 
    return product == null ? product = ... : product; 
} 

private IFoo foo; 

public IFoo getFoo() { 
    return foo == null ? foo = ... : foo; 
} 
+1

는 소리. –

+1

또 다른 점은 너무 많은 사람들은 "uuups, thingy가 여전히 null"로 인해 증가 된 복잡성 (및 견고성 문제)보다 "메모리의 사소한 절약"을 평가하는 것처럼 변수의 게으른 초기화가 좋은 것이라고 가정합니다. 그래서 사이드 노트 : 아마도 당신은 단순히 귀하의 필드가 항상 null이 아닌지 확인하십시오. – GhostCat

+0

질문은 어떻게'ISomeInterface'가 생성되는지입니다. BTW'foo == null? foo : ...'는 단지'null'을 반환하기 때문에 만들지 않습니다. 당신은 아마'! = null'이되지 않을 것입니다. –

답변

2

로 나 코드 repet을 무시 할 수 있도록 몇 가지 자바 annotaion입니다 그러한 객체를 만드는 방법은 아마도 매우 관례 일 수 있습니다.

@OliverCharlesworth에서 언급 한대로 memoized supplier을 사용할 수 있습니다. 자바 8 람다는 다소 간결합니다. 그런 다음 공급자 입력란에 맞춤 주석을 작성하고 직접 APT 플러그인을 작성하십시오 (see Google's auto project for some examples)

예 :

public final Supplier<ISource> source = Suppliers.memoize(-> new Source()); 

이 BTW memoize가 foo == null ? foo = ... 달리 스레드 안전됩니다

@SupplierToGetter 
private final Supplier<ISource> source = Suppliers.memoize(-> new Source()); 

그렇지 않으면 하나의 옵션은 공공과 공급 업체 필드를 만들고 게터를 생성 귀찮게하지 그냥. 코멘트 후

편집 :

이 자바 7 버전 (구아바를 사용) 것입니다 : 당신이 memoizing`Supplier`을 사용할 수 있습니다처럼

public final Supplier<ISource> source = Suppliers.memoize(new Supplier<ISource>() { 
    public ISource get() { return new Source(); } 
}); 
+0

자바 7에는 해결책이없는가요? –

+0

그냥 구아바를 사용하고 람다 대신 익명의 클래스를 사용하십시오. –