注释为默认值

时间:2018-06-15 17:19:02

标签: java annotations

我的项目中存在可见性问题,一旦我的实现作为我的界面不可见。 无法解决可见性问题。

我想到了一个解决方案:

我写了一张便条

@Target (ElementType.TYPE)
@Retention (RetentionPolicy.RUNTIME)
public @interface Register {
}

我在课程中使用它

@Register
public class ClientAlteracaoObserver implements Complement <ClientGestaoValue>, IClienteAlteracaoObserver {
}

我在项目初始化时创建一个引擎,在容器中记录实现和接口

public class Injection implements ServletContextListener {

    @Override
    public void contextDestroyed( ServletContextEvent arg0 ) {

    }

    @Override
    public void contextInitialized( ServletContextEvent arg0 ) {
        System.out.println( "Agora as coisas vão ficar boas!!!!" );
        Container container = Container.getInstance();
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider( true );
        scanner.addIncludeFilter( new AnnotationTypeFilter( Register.class ) );
        Set< BeanDefinition > registers = scanner.findCandidateComponents( "br.com.syonet" );

        for ( BeanDefinition bd : registers ) {
            try {
                Class< ? > clazz = Class.forName( bd.getBeanClassName() );
                List< Class< ? > > interfaces = Arrays.asList( clazz.getInterfaces() );
                for ( Class< ? > contract : interfaces ) {
                    container.register( contract, clazz );
                }
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
        System.out.println( "GG garotão!" );

    }
}

我的容器

public class Container {
    private static final Container instance = new Container();
    private final HashMap< String, Object> intances = new HashMap<>();

    private Container() { }

    public static Container getInstance() {
        return instance;
    }

    public void register( Class<?> contract, Class<?> contractImpl ) throws InstantiationException, IllegalAccessException {
        this.intances.put( contract.getName(), contractImpl.newInstance() );
    }

    @SuppressWarnings("unchecked")
    public <T> T get( Class<T> interfac ) {
        return ( T ) this.intances.get( interfac.getName() );
    }

    public static <T> T load( Class<T> interfac ) {
        return ( T ) instance.get( interfac );
    }

}

最后我用这种方式:

class Test {
    private IClienteAlteracaoObserver observer = Container.load(IClienteAlteracaoObserver.class);
}

但是我想创建注释@Inject来完成Container.load(IClienteAlteracaoObserver.class)的工作;

class Test {
    private @Inject IClienteAlteracaoObserver observer;
}

1 个答案:

答案 0 :(得分:0)

虽然你想要什么是可能的,但我不推荐它。注释主要是元信息,主要在编译时处理。为此,编写一个注释处理器,必须将其传递给编译器,以便它可以处理注释。 Baeldung有一个nice tutorial on annotation processing,其中通过注释处理器创建一个简单的构建器。

我提出了一个静态最终变量形式的替代方案:

callFunctionReturnResultAndFlushedQueue

Ideone live demo

您可以将此方法与public Class Test { public static final String DEFAULT_FIELD_VALUE = "example"; private String field; // to ensure encapsulation, all attributes should be private public Test() { this(DEFAULT_FIELD_VALUE); } public Test(String field) { this.field = field; } public String getField() { return this.field; } public static void main(String... args) { System.out.println(new Test().getField().equals("example")); } } - 块结合使用,以使配置更加灵活,例如:从系统变量或配置文件中读取默认值。

如果您的对象开始变得更加复杂,您可以查看Builder pattern以获得更灵活的解决方案。

对您的代码的评论:由于数据封装,您不希望您的类属性直接从外部访问。因此,您不应该设置它们static。相反,请写mutator methods