[英]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.