Lombok, Adnotacje, Enum, Dto - rlip/java GitHub Wiki
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum Action {
ACTION("action");
String value;
static Set<String> PROPER_STRING_REPRESENTATIONS = Arrays.stream(AdminAction.values())
.map(Action::toString)
.collect(Collectors.toSet());
static Set<String> PROPER_STRING_REPRESENTATIONS = Collections.unmodifiableSet(
Arrays.stream(Country.values())
.map(Country::toString)
.collect(Collectors.toSet())
);
static boolean contains(String value) {
return PROPER_STRING_REPRESENTATIONS.contains(value);
}
}
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
@Value
class ChallengeDto {
@Document("BlockingConfig")
@Value
@Builder(toBuilder = true)
Można z @Builder @AllArgsConstructor
ale chyba nie trzeba
@ConfigurationProperties(prefix = "trader")
@NoArgsConstructor
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
class TraderProperties {
Stock stock;
@NoArgsConstructor
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
static class Stock {
@Repeatable(Profiles.class)// mozna użyć w wiele razy jedną annotację (przykład na dole)
//dzięki temu adnotacja bedzie dziedziczona, bo domyślnie nie jest
@Inherited
//można ustalić kiedy jest usuwana
@Retention(RetentionPolicy.RUNTIME) //SOURCE - usuwane w czasie kompliacji,
// CLASS - domyślna, będzie na poziomie klasy skompilowanej, ale nie w runtime
// RUNTIME - będzie w RUNTIME, można się dostać za pomocą refleksji
//ogranicznenie gdzie można użuwać
@Target(ElementType.TYPE) // TYPE - możemy tylko tą adnotację dać na typ,
// FIELD - na polach, elementach wyliczenia
// PARAMETER - na parametrach funkcji, konstruktora
// METHOD - na metodzie
// ANNOTATION_TYPE - tylko typie annotacji
// TYPE_USE - dowolny typ javowy
public @interface Profile {
// dozwolene: primitive types, String, Class, enums, annotations, arrays
String CONFIG_FILE_NAME = "config.yml";
// wymagane, jeśli nie ma innego wymaganego atrybutu to przy deklaracji można pominąć value
ProfileName value(); // przy oznaczaniu Profile(value=TEST)
// ProfileName name(); // wymagane
String description() default ""; // optional, with default value
String[] tags() default {}; //defaultowa puta tablica
enum ProfileName {
TEST, DEVELOPMENT, PRODUCTION
}
}
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Profiles {
Profile[] value();
}
//---
//@Profile(DEVELOPMENT) //domyślnie ustawiamy value
@Profile(value = TEST, tags = {"test", "prod"})
//@Profile(value = DEVELOPMENT, description = "some description", tags = {"test", "prod"})
//stary wariant zapisu, niezalecany
//@Profiles({
// @Profile(value = TEST, tags = {"test", "prod"})
// @Profile(value = DEVELOPMENT, description = "some description", tags = {"test", "prod"})
//})
public class Annotations {