#java #spring #spring-boot
Вопрос:
я знаю это соглашение об универсальных
электронных элементах (широко используемых в рамках коллекций Java)
K — Ключ
N — Число
T — Тип
V — Значение
S,U,V и т. Д. — 2-й, 3-й, 4-й типы
Но я не знаю этого,когда я называл службу генериков весной
, например, этот абстрактный класс используется, когда данные выбирают, вставляют, обновляют, удаляют в контроллере
я хочу назвать B тело запроса и RB, чтобы назвать тело ответа, все в порядке? Можете ли вы порекомендовать мне название дженериков, которое используется в сервисе контроллера ?
public abstract class AbstractService<B, RB> {
public abstract RB doInsert(B entity);
}
Обслуживание
@Service
public class FruitInsertService extends AbstractService<FruitEntity, String[]> {
@Override
public String[] doInsert(FruitEntity entity) {
return new String[] {};
}
}
Контроллер
@RestController
@RequestMapping("/fruit")
public class FruitInsertController {
@Autowired
FruitInsertService fruitInsertService;
@PostMapping("/insert.do")
public ResponseEntity<Object> insertFruit(FruitEntity fruitEntity){
return ResponseEntity.ok(fruitInsertService.doInsert(fruitEntity));
}
}
Ответ №1:
Если вы хотите действовать строго по правилам и общим правилам, вы можете сделать следующее. Обратите внимание, что в своей записи вы уже упомянули, что T следует использовать для типа, а S-для второго типа и т. Д..
public abstract class AbstractService<T, S>
Однако, если вы хотите сделать это более явным и избежать любой возможной путаницы со вторыми типами и т. Д., Вы можете использовать соглашение, как показано ниже, которое также объясняет контекст использования.
public abstract class AbstractService<ReqT, ResT>
При желании вы также можете сделать их похожими на классы, чтобы отобразить более конкретные входные данные, и выбрать что-то вроде приведенного ниже.
public abstract class AbstractService<Content, Response>
Все варианты будут работать, но обычно это определяется соглашением, которому следуют в вашем проекте/предприятии. Первый, вероятно, то, что вы здесь ищете.
Пожалуйста, обратите внимание, что, хотя Java не будет недовольна 2-м и 3-м вариантами, упомянутыми здесь, если вы сторонник качества кода и статического анализа, Sonar будет недоволен использованием таких имен. Он ожидает, что вы будете использовать либо соглашение S, T, либо вы также можете выбрать T1, T2 для указания двух типов.
public abstract class AbstractService<T1, T2>
Между S, T и T1, T2 вам, вероятно, следует придерживаться соглашения S, T. Сонар ожидает, что имена типов будут соответствовать шаблону '^[A-Z][0-9]?$'
Надеюсь, это поможет вам принять решение. Если вас смущают варианты, вы можете просто выбрать 1-й вариант.