我有一个场景,其中有四种方法包含所有相同的代码,除了 try block 中的一两行之外。有人可以建议如何重构它吗?
我尝试了 Enum 和 switch,但找不到正确的实现。 问题是所有方法都有不同的返回类型。
public static void insertDocument(Test database, Test2 collectionName, Document docToInsert) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
addUniqueId(docToInsert);
database.getCollection(collectionName).insertOne(docToInsert);
return;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
public static FindIterable<Document> findDocument(MongoDatabase database, String collectionName, Document docToFind) {
int count = 0;
int maxTries = getMongoQueryRetries();
FindIterable<Document> document = null;
while (count < maxTries + 1) {
try {
return database.getCollection(collectionName).find(docToFind);
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
return document;
}
public static DeleteResult deleteDocument(MongoDatabase database, String collectionName, Document docToDelete) {
int count = 0;
int maxTries = getMongoQueryRetries();
DeleteResult deleteResult = null;
while (count < maxTries + 1) {
try {
deleteResult = database.getCollection(collectionName).deleteOne(docToDelete);
return deleteResult;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
return deleteResult;
}
public static void findAndReplaceDocument(MongoDatabase database, String collectionName, Document docToBeReplaced, Document newDocument) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
database.getCollection(collectionName).findOneAndReplace(docToBeReplaced, newDocument);
return;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
异常(exception):将所有逻辑集中在一处
最佳答案
我认为这可以通过 Callable
来完成,例如:
public static <T> T processDbAction(Callable<T> dbAction) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
return dbAction.call();
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
换句话说:您从这样一个辅助方法开始,它将所有常见的“框架”放在您的调用周围。然后您可以拥有 Callable 接口(interface)的不同实现,这些实现可以专注于其核心业务,而无需担心重试或异常处理/日志记录。
喜欢:
public FindAction implements Callable<Document> {
private final MongoDatabase database;
private final collectionName;
private final Document docToFind;
...
@Override
public Document call() throws Exception {
return database.getCollection(collectionName).find(docToFind);
}
关于java - 无法重构方法中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252122/