查看以下模型:
interface Context {
BeanFactory getBeanFactory(); // public method
void refresh(); // public method
void destroy(); // public method
}
interface BeanFactory {
<T> T getBean(String id); // public method
void destroyBeans(); // should be private method for user, but visible for Context
}
class ContextImpl implements Context {
private BeanFactory beanFactory;
@Override
public void destroy() {
beanFactory.destroyBeans();
}
}
Run Code Online (Sandbox Code Playgroud)
ContextImpl
使用BeanFactory
接口,这就是方法destroyBeans()
放置在那里的原因。但我不希望它在那里,因为它是内部 API,应该对用户隐藏。
我想到使用内部AbstractBeanFactory
受保护方法的引用。这将解决向最终用户公开方法的问题,但会用抽象类替换接口。destroyBeans()
Context
另一种变体是创建另一个接口,该接口将扩展最终用户接口,并在 Context 中使用它。这将破坏用户创建自己的 BeanFactory 实现的能力。
我想知道是否有一个众所周知的解决方案来解决该问题,或者只是看看其他替代方案。
问题在于一般限制:
public List<Class<? extends Annotation>> getAnnotations() {
return new ArrayList<>(Arrays.asList(Override.class));
}
Run Code Online (Sandbox Code Playgroud)
实际返回类型是ArrayList<Class<Override>>
Method期望的List<Class<? extends Annotation>>
Class<Override>
是Class<? extends Annotation>
Class<? extends Annotation> c = Override.class;
//允许的子类型
ArrayList
List
如果元素的类型匹配:
List<? extends Number> l = new ArrayList<Integer>();
//允许,则是a的子类型
但是,这是不允许的:
List<Class<? extends Annotation>> l = Arrays.asList(Override.class);
List<Class<? extends Annotation>> l = new ArrayList<>(Arrays.asList(Override.class));
Run Code Online (Sandbox Code Playgroud)
甚至是可能还是Class
通配符被破坏了?
我有一个使用 Tomcat JDBC 连接池的项目。
根据JDK规范,该Connection.close()
方法应该释放连接的资源,如Statement
和ResultSet
。
我知道当使用池中的连接时,该close()
方法将被覆盖以将连接释放回池。我想知道这个覆盖的方法是否应该正确关闭相关资源。
Tomcat JDBC 连接池不释放资源,我需要在我的代码中显式关闭所有资源。
是否有任何其他池实现可以在调用时正确关闭所有相关资源Connection.close()
?
我不知道如何开始这个.NullPointerException
在一个不应该的地方我很荒谬.我对答案的期望不高,因为情况看起来像是异常,但问题和答案(如果我最终找到答案)可能对教育有用.如果不是,我可能会删除这个问题.
Caused by: java.lang.NullPointerException
at com.ah.dao.hbase.Snapshotable.lock(Snapshotable.java:17)
at com.ah.pipeline.dump.DumpController.dump(DumpController.java:78)
Run Code Online (Sandbox Code Playgroud)
07: public abstract class Snapshotable {
08: private final AtomicBoolean readonly = new AtomicBoolean(false);
09:
10: abstract public TableSuit getTableInfo();
11:
12: public boolean locked() {
13: return readonly.get();
14: }
15:
16: public final void lock() {
17: readonly.set(true); <-- happens here
18: }
19:
20: public final void release() {
21: readonly.set(false);
22: }
23: }
Run Code Online (Sandbox Code Playgroud)
起初readonly
变量不是最终的,所以我虽然可能是不安全的出版效果,但现在我没有想法.在我们的代码中没有使用这些变量的反射技巧,但是这个类后代的一些方法用aspectj代理.
@Service
public class HDao extends Snapshotable {
@PerformanceMonitoring …
Run Code Online (Sandbox Code Playgroud) 最近我们开始探索Solr部分索引更新。
完整更新和部分更新的 API 看起来很相似。代替
doc.addField("location", "UK")
solrClient.add(doc)
Run Code Online (Sandbox Code Playgroud)
你必须写
doc.addField("location", map("set", "Germany"))
solrClient.add(doc)
Run Code Online (Sandbox Code Playgroud)
我期望发生什么:solr 将更新字段“location”的倒排索引
实际发生的情况:
结果,所有非存储字段都会丢失。
我在邮件列表中发现了一些旧的讨论,人们说这是预期的行为,您需要存储所有字段等等。我们不想存储所有字段。“存储”属性是为需要从 Solr 响应返回给调用者的字段而设计的。我们只需要响应中的小元信息,这使得存储的所有字段看起来有点大材小用。
问题是 - 为什么 solr/lucene 执行所有这些步骤来执行部分更新?根据我的理解,每个字段在其自己的文件中都有自己的倒排索引,因此应该可以独立更新字段。从实际发生的情况来看,solr/lucene 无法更新单个字段的索引,我找不到原因。
关于该主题的讨论:
我在java进程(oracle jdk1.7_072)上运行jstack并找到了这些行
"C2 CompilerThread1" daemon prio=10 tid=0x00007f1a8415d000 nid=0x7d72 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0x00007f1a8415a000 nid=0x7d71 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Run Code Online (Sandbox Code Playgroud)
我知道C2是一个字节码编译器.我有三个问题:
nid
参数是什么意思?第一个nid=0x7d72
看起来类似于java版本,是巧合与否?让我们假设,我们需要创建一个必须提供并发性的映射,因此,我们决定使用a ConcurrentHashMap
.但是,ConcurrentHashMap
实现ConcurrentMap
和ConcurrentMap
实现Map
接口(Multilevel inheritance).由于通过接口引用对象是Java中的最佳实践,这是在这种情况下定义对象的最佳方法吗?请分享原因.
ConcurrentMap map = new ConcurrentHashMap();
Run Code Online (Sandbox Code Playgroud)
要么
Map map = new ConcurrentHashMap();
Run Code Online (Sandbox Code Playgroud) 正如在标题中那样 - 在Java的单线程编程环境中,volatile是否有用?我知道它用于确保变量的值总是在内存中实际检查,因此在任何情况下,该值可能会以app /编译器不会注意到的方式更改(在单线程应用程序中)?
我有连接池的singelton.
public enum ConnectionPool {
INSTANCE;
private DataSource ds = null;
ConnectionPool() {
try {
final Context initCtx = new InitialContext();
ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/test");
} catch (NamingException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
Run Code Online (Sandbox Code Playgroud)
我应该同步getConnection()以防止从不同的线程获取相同的实例吗?它看起来已经被Tomcat同步了,但我不确定(我使用的是Tomcat 8).