我的项目中存在可见性问题,一旦我的实现作为我的界面不可见。 无法解决可见性问题。
我想到了一个解决方案:
我写了一张便条
@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;
}
答案 0 :(得分:0)
虽然你想要什么是可能的,但我不推荐它。注释主要是元信息,主要在编译时处理。为此,编写一个注释处理器,必须将其传递给编译器,以便它可以处理注释。 Baeldung有一个nice tutorial on annotation processing,其中通过注释处理器创建一个简单的构建器。
我提出了一个静态最终变量形式的替代方案:
callFunctionReturnResultAndFlushedQueue
您可以将此方法与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。