Lombok, Adnotacje, Enum, Dto - rlip/java GitHub Wiki

Enum

@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);
    }
}

Dto

@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(toBuilder = true)
@Value
class ChallengeDto {

Document

@Document("BlockingConfig")
@Value
@Builder(toBuilder = true)

Property

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 {

Annotacje

@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 {
⚠️ **GitHub.com Fallback** ⚠️