4. Capability의 사용 - Tictim/Capabilities-Within-TileEntity GitHub Wiki

구현된 TileEntity의 LazyOptionalgetCapability 호출로 가져올 수 있습니다.

TileEntity te = world.getTileEntity(pos);
if(te!=null){
    LazyOptional<IMyAwesomeMagic> optional = te.getCapability(ModCapabilities.MY_AWESOME_MAGIC, side);
}

LazyOptional을 사용하는 방법은 몇 가지가 있습니다. 먼저 가장 간단한 케이스를 살펴봅시다 - Capability에 해당하는 값의 존재 여부만 체크할 때.

if(optional.isPresent()){
    // Do the thing
}

isPresentempty가 아니며 무효화Invalidate되지 않은 LazyOptional일 경우 true를 반환합니다. 무효화가 뭐냐고요? 곧 알려드립니다!

위 메소드는 간단한 체크에는 유용하지만, 인스턴스를 필요로 하는 상황에서는 별 쓸모가 없습니다. 다음 사용법은 인스턴스를 가져와 체크하며, 보편적으로 사용 가능합니다.

IMyAwesomeMagic magic = optional.orElse(null);
if(magic!=null) {
    // Do the thing
}

orElse는 값이 존재하지 않는 경우 인자로 전달받은 기본값을 대신 반환합니다.

추가로, 기본값은 굳이 null이 아니어도 됩니다.

IMyAwesomeMagic magic = optional.orElse(DEFAULT_MAGIC);
// Do the thing - no null checks!

optional.orElse(null) 후 null 체크가 거슬린다면 ifPresent를 사용할 수도 있습니다. 람다식 내부의 문장은 값의 존재 시에만 실행됩니다.

optional.ifPresent(magic -> {
    // Do the thing
});

또는, 기본값을 제공하고는 싶지만 값이 존재하지 않을 때만 기본값의 Evaluate를 실행하고 싶을 때도 있을 것입니다. 그럴 때는 대신 기본값의 Supplier를 인자로 받는 orElseGet을 사용하시면 됩니다.

IMyAwesomeMagic magic = optional.orElseGet(SomeDefaultMagicManager::createDefaultMagic);
// Do the thing

마지막으로, 만약 Capability가 존재하지 않을 때 오류를 일으키고 싶다면, 다음 메소드를 사용하시면 됩니다.

Juliet juliet = optional.orElseThrow(() -> new RomeoDiedException("Juliet is dead"));
// Do the... "thing"

LazyOptional은 편의를 위한 메소드를 몇 가지 추가로 제공합니다. 하지만 이 정도만 알아도 여러분이 원하는 것을 만들기에는 충분할 것입니다.

다음으로 넘어가기 전에, isPresent를 제외한 모든 메소드는 LazyOptional의 내부 값을 evalute시킨다는 점은 알아두세요.