小编Ada*_*ker的帖子

在代码中使用接口但对最终用户隐藏内部方法的最佳实践

查看以下模型:

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 实现的能力。

我想知道是否有一个众所周知的解决方案来解决该问题,或者只是看看其他替代方案。

java encapsulation interface

5
推荐指数
1
解决办法
1768
查看次数

是否可以实现具有签名List <Class <?的方法?在Java中扩展Annotation >>

问题在于一般限制:

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;//允许的子类型

ArrayListList如果元素的类型匹配:
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通配符被破坏了?

java generics wildcard

5
推荐指数
1
解决办法
383
查看次数

Tomcat JDBC 连接资源未释放

我有一个使用 Tomcat JDBC 连接池的项目。

根据JDK规范,该Connection.close()方法应该释放连接的资源,如StatementResultSet

我知道当使用池中的连接时,该close()方法将被覆盖以将连接释放回池。我想知道这个覆盖的方法是否应该正确关闭相关资源。

Tomcat JDBC 连接池不释放资源,我需要在我的代码中显式关闭所有资源。

是否有任何其他池实现可以在调用时正确关闭所有相关资源Connection.close()

java tomcat pool jdbc

5
推荐指数
1
解决办法
630
查看次数

访问final字段时出现奇怪的NullPointerException

我不知道如何开始这个.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代理.


使用aop详细信息更新

@Service
public class HDao extends Snapshotable {

   @PerformanceMonitoring …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception

5
推荐指数
1
解决办法
445
查看次数

Solr/Lucene 文档中的部分更新

最近我们开始探索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 加载文档的存储字段
  • 应用给定的文档更新
  • 通过id删除文档
  • 将文档写入索引

结果,所有非存储字段都会丢失。

我在邮件列表中发现了一些旧的讨论,人们说这是预期的行为,您需要存储所有字段等等。我们不想存储所有字段。“存储”属性是为需要从 Solr 响应返回给调用者的字段而设计的。我们只需要响应中的小元信息,这使得存储的所有字段看起来有点大材小用。

问题是 - 为什么 solr/lucene 执行所有这些步骤来执行部分更新?根据我的理解,每个字段在其自己的文件中都有自己的倒排索引,因此应该可以独立更新字段。从实际发生的情况来看,solr/lucene 无法更新单个字段的索引,我找不到原因。

关于该主题的讨论:

lucene indexing solr

5
推荐指数
1
解决办法
2106
查看次数

C2中的CompilerThread

我在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是一个字节码编译器.我有三个问题:

  1. 为什么有2个编译器线程?可以或多或少吗?如果是的话,何时?编译是否并行运行?
  2. nid参数是什么意思?第一个nid=0x7d72看起来类似于java版本,是巧合与否?
  3. 为什么条件地址是绝对零?

java jit jvm

3
推荐指数
1
解决办法
4468
查看次数

使用多级继承定义对象

让我们假设,我们需要创建一个必须提供并发性的映射,因此,我们决定使用a ConcurrentHashMap.但是,ConcurrentHashMap实现ConcurrentMapConcurrentMap实现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 oop inheritance interface

2
推荐指数
1
解决办法
135
查看次数

在Java中的单线程应用程序中,volatile是否有用?

正如在标题中那样 - 在Java的单线程编程环境中,volatile是否有用?我知道它用于确保变量的值总是在内存中实际检查,因此在任何情况下,该值可能会以app /编译器不会注意到的方式更改(在单线程应用程序中)?

java multithreading volatile single-threaded

1
推荐指数
1
解决办法
220
查看次数

我应该同步DataSource的getConnection()

我有连接池的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).

java sql connection-pooling jdbc

1
推荐指数
1
解决办法
1293
查看次数