私はいくつかの高度なJavaコードに遭遇しました(私にとっては高度です:))理解の助けが必要です。
クラスには、次のようなネストされたクラスがあります。
private final class CoverageCRUDaoCallable implements
Callable<List<ClientCoverageCRU>>
{
private final long oid;
private final long sourceContextId;
private CoverageCRUDaoCallable(long oid, long sourceContextId)
{
this.oid = oid;
this.sourceContextId = sourceContextId;
}
@Override
public List<ClientCoverageCRU> call() throws Exception
{
return coverageCRUDao.getCoverageCRUData(oid, sourceContextId);
}
}
後で外部クラスに、作成される呼び出し可能クラスのインスタンスがあります。これが何であるか私にはわかりません:
ConnectionHelper.<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);
私には、Java構文のようには見えません。この不可解な構文で何が起こっているのか詳しく説明していただけませんか?以下のコードの抜粋で使用されていることがわかります。
CoverageCRUDaoCallable coverageCRUDaoCallable = new CoverageCRUDaoCallable(
dalClient.getOid(), sourceContextId);
// use Connection helper to make coverageCRUDao call.
List<ClientCoverageCRU> coverageCRUList = ConnectionHelper
.<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);
EDITEDはConnectionHelperクラスを追加しました。
public class ConnectionHelper<T>
{
private static final Logger logger =
LoggerFactory.getLogger(ConnectionHelper.class);
private static final int CONNECTION_RETRIES = 3;
private static final int MIN_TIMEOUT = 100;
public static <T> T tryExecute(Callable<T> command)
{
T returnValue = null;
long delay = 0;
for (int retry = 0; retry < CONNECTION_RETRIES; retry++)
{
try
{
// Sleep before retry
Thread.sleep(delay);
if (retry != 0)
{
logger.info("Connection retry #"+ retry);
}
// make the actual connection call
returnValue = command.call();
break;
}
catch (Exception e)
{
Throwable cause = e.getCause();
if (retry == CONNECTION_RETRIES - 1)
{
logger.info("Connection retries have exhausted. Not trying "
+ "to connect any more.");
throw new RuntimeException(cause);
}
// Delay increased exponentially with every retry.
delay = (long) (MIN_TIMEOUT * Math.pow(2, retry));
String origCause = ExceptionUtils.getRootCauseMessage(e);
logger.info("Connection retry #" + (retry + 1)
+ " scheduled in " + delay + " msec due to "
+ origCause);
+ origCause);
}
}
return returnValue;
}
クラスはジェネリックであると考えることがよくありますが、メソッドもジェネリックにすることができます。一般的な例はArrays.asList
です。
ほとんどの<...>
場合、ジェネリックメソッドを呼び出す場合でも、山括弧を使用した構文を使用する必要はありません。これは、Javaコンパイラが実際に状況によっては基本的な型推論を行うことができる場所だからです。 。たとえば、Arrays.asList
ドキュメントに記載されているスニペットではタイプが省略されています。
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
しかし、これはジェネリック型が明示的に指定されているこのバージョンと同等です。
List<String> stooges = Arrays.<String>asList("Larry", "Moe", "Curly");
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加