繁体   English   中英

注释为默认值

[英]Annotation to default value

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

我想到了一个解决方案:

我写了笔记

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

虽然您想要的是可能的,但我不建议这样做。 注释主要是元信息,大部分在编译时进行处理。 为此,编写一个注释处理器,必须将其传递给编译器,以便它可以处理注释。 Baeldung有一个很好的有关注释处理的教程 ,其中通过注释处理器创建了一个简单的构建器。

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

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

Ideone现场演示

您可以将此方法与static -block结合使用,例如通过从系统变量或配置文件中读取默认值来使配置更加灵活。

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

在代码上的注释:由于数据封装,您不希望直接从外部访问类属性。 因此,您不应将其设置为public 而是编写mutator方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM