小编Joh*_*erg的帖子

java配置/参数传递设计

我经常发现需要设计具有可配置功能的对象.

举例来说,假设我正在创建一个DateIterator.可配置选项可能是迭代闭合间隔[start, end]还是开放端间隔[start, end).


  • (1)在我看来,不合理的解决方案 - 仅限于一个真/假配置选项
new DateIterator(boolean openInterval);
Run Code Online (Sandbox Code Playgroud)
  • (2)类型安全的枚举方式 - 通常有点笨重
new DateIterator(Interval.OPEN_END);
Run Code Online (Sandbox Code Playgroud)
  • (3)非传统的尝试 - 很好但不太直接
new DateIterator().openEnd();
Run Code Online (Sandbox Code Playgroud)
  • (4)继承方法 - 经常过度工程化
new OpenEndedDateIterator();
Run Code Online (Sandbox Code Playgroud)

为此我提出了一些我认为较差的替代方案,如基于整数的配置new DateIterator(Interval.OPEN_END);或基于属性的配置.

还有其他方法吗?您更喜欢哪种方法?

java configuration parameter-passing

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

gitolite + cgit:找不到存储库

我已经设置并配置gitolite并希望为其配置cgitWeb界面.

问题:

使用cgit我浏览目录时收到错误:

找不到存储库

建立

创建新存储库时,gitolite/home/git/repositories自动为其创建相应的目录.cgitconfiguered读取使用这些存储库:

project-list=/home/git/projects.list 
scan-path=/home/git/repositories
Run Code Online (Sandbox Code Playgroud)

问题是这些存储库似乎不是存储库.如果我改为使用手动克隆其中一个存储库

git clone --bare user@server:repo
Run Code Online (Sandbox Code Playgroud)

它似乎工作.每次签入新的存储库时,我都不想手动执行此操作.为什么gitolite 存储库已经创建了?我该如何自动化?

git version-control dvcs gitolite cgit

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

具有相同名称的Jaxb对象

似乎可以解组具有相同名称的两个不同 jaxb对象.

有一Bar节课......

public abstract Bar {
   private @XmlElement String val;
}
Run Code Online (Sandbox Code Playgroud)

..有两个实现(构造函数等省略):

@XmlRootElement(name="bar")
public class BarA extends Bar { }

@XmlRootElement(name="bar")
public class BarB extends Bar {
     private @XmlElement(required=true) String type;
}
Run Code Online (Sandbox Code Playgroud)

最后,我想Bar从XML 解组一个文档列表,类似于以下内容

<bars>
  <bar>
    <val>1</val>
  </bar>
  <bar>
    <val>1</val>
    <type>2</type>
  </bar>
</bars>
Run Code Online (Sandbox Code Playgroud)

该列表包含在一个使用该类的类中 @XmlAnyElement

@XmlRootElement
public class Bars {

  @XmlMixed
  @XmlAnyElement(lax = true) 
  @XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)})
  private List<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)

但是我似乎得到的情况下无论是 BarABarB,取其最后的元素@XmlElementRefs …

java xml rest jaxb

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

带分页的 API 的流与迭代器

给定一个具有分页功能的 Web API,该 API一次返回的项目数量超出了内存容量

HTTP GET /items?start=0&limit=10
Run Code Online (Sandbox Code Playgroud)

我想构建一个易于使用的Java客户端。分页客户端很难使用

PageRequest pageRequest = new PageResut(0,10);
Page<Item> page = client.findItems(page);
while( !page.isLastPage() ) {
   Page<Item> nextPage = client.findItems( page.getNextPage() );
}
Run Code Online (Sandbox Code Playgroud)

将分页客户端隐藏在Iterator..

Iterator<Item> items = client.pagingItemsIterator();
// every 10 elements the iterator requests the next page behind the scenes i.e.
// the paging code of above is hidden in an iterator
items.forEachRemaining(this::dostuff);
Run Code Online (Sandbox Code Playgroud)

...或者Stream使 API 更易于使用

Stream<Item> items = client.pagingItemsStream();
// every 10 elements the stream requests the next …
Run Code Online (Sandbox Code Playgroud)

java api rest java-stream

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

原始数据类型的Java数组

为什么下一个代码使用引用类型而不是原始类型?

int[] a = new int[5];
int[] b = a;
a[0] = 1;
b[0] = 2;
a[1] = 1;
b[1] = 3;
System.out.println(a[0]);
System.out.println(b[0]);
System.out.println(a[1]);
System.out.println(b[1]);
Run Code Online (Sandbox Code Playgroud)

输出为:2 2 3 3而不是1 2 1 3

java arrays types pass-by-reference pass-by-value

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

Java未绑定的通配符泛型

Bar课堂上使用通配符类型的泛型完全跳过它们有什么好处吗?

public class Foo<T> {}

public interface Bar {
    public void addFoo(Foo<?> foo);
    public Foo<?> getFoo(String name);
}
Run Code Online (Sandbox Code Playgroud)

java generics nested bounded-wildcard

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

在java方法中获取return语句

如何在java中获取方法的所有可能返回值?

例:

Object onEvent() {
 if (condition) {
     return "a";
 }

 if (condition2) {
    return "b";
 }

 if (condition3) {
     return "c";
 } 

}
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

String[] returns = Utils.getReturnStatements("object.onEvent()");
returns = ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

java

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

Spring hibernate jdbc批量大小

我有几个场景,我认为从hibernate文档中有点不清楚.

数据类:

class HibernateDao {
      // ...

      @Transactional
      public void store(List<Object> batch) {
          for(Object o : batch) {
             hibernate.store(o);
          }
      }
}
Run Code Online (Sandbox Code Playgroud)

场景1

hibernate.jdbc.batch_size = 1
Run Code Online (Sandbox Code Playgroud)

Q1:store(..)使用一组10项目调用时会发生什么?会有10 1个交易还是只有一个?


情景2

hibernate.jdbc.batch_size = 10
Run Code Online (Sandbox Code Playgroud)

Q2:store(..)使用一组1项目调用时会发生什么?无论batch_size属性如何,它是否会立即写入后备存储?


从hibernate文档:

如果您使用身份标识符生成器,​​Hibernate会透明地禁用JDBC级别的插入批处理

问题3:什么被归类为identify identifier generator,使用注释@Id@GeneratedValue(strategy = GenerationType.AUTO)

java spring hibernate transactions batch-processing

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

补充地图

我们有两个互补的地图代码,如下所示:

private final Map<Integer, String> idToName = new HashMap<Integer, String>();
private final Map<String, Integer> nameToID = new TreeMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

每当我们把东西放在一个时,我们也把另一个(键和值反转)放在另一个中:

nameToID.put(name, id);
idToName.put(id, name);
Run Code Online (Sandbox Code Playgroud)

我们遇到了这个应用程序的内存问题.看来这里有很多重复.有没有办法让这个内存更有效?我们可以使用一些单一的结构?我意识到这可能是以时间效率为代价的,所以我对权衡利弊感兴趣.

java memory map

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

使对象弹簧管理

如何管理已存在的对象弹簧?我想把它连接到Springs AoP使用的功能aspectj.我知道这是一个挑战,因为Spring AoP使用可能与对象一起创建的动态代理.

我为什么需要这个?

我有一个第三方类,它接受一个只在运行时知道的构造函数参数,因此我似乎无法将它添加到我的applicationContext或使用spring FactoryBean接口进行构造.还有其他方法吗?

我已经尝试了以下但没有取得巨大成功:

Obj obj = new ThirdPartyObj("runtime constructor arg");
appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj");
Run Code Online (Sandbox Code Playgroud)

可能是弹簧管理的,但我仍然不能用它来触发方面.


[编辑] axtavt指出问题是我不使用从中返回的对象initializeBean(..).提到的两种方法都有效,但前提是:

  • 使用界面ObjInterface obj = (ObjInterface) ac.getBean("obj", args);或我们将获得:

    java.lang.ClassCastException: $Proxy28 cannot be cast to com.company.Obj

  • 不使用接口但启用CGLIB.这需要一个非私有的默认构造函数,否则我们将获得:

    java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

java spring aspectj spring-aop autowired

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

Java - 表达式必须是数组类型,但它已解析为Stack <String>

我正在制作一个程序,我声明了一个堆栈并将其命名为"单词".我使用这段代码,如下:

Stack <String> words = new Stack<String>();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此代码对其中的单词进行随机播放时,会出现有关它的错误:

Collections.shuffle(words);
int mistakes = 0;
final String CORRECT_WORD= words[0];
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

java

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

Java init方法

有什么方法可以确保在java中调用init方法?我看到的替代方案是

  • 不要测试它,让方法本身失败,可能是a NullPointerException
  • 测试方法是否已初始化或抛出
public void foo() {
     if (!inited) {
         throw new IllegalArgumentException("not initalized");
     }
     ...
}
Run Code Online (Sandbox Code Playgroud)
  • Delagate
public void foo() {
     if (!inited) {
         throw new IllegalArgumentException("not initalized");
     }
     fooInternal();
}

private void fooInternal(){ ... };
Run Code Online (Sandbox Code Playgroud)
  • 总是初始化,否则使init成为noop
public void foo() {
     init();
     ...
}
public void init() {
     if(!inited) {
         ...
     }
}
Run Code Online (Sandbox Code Playgroud)
  • 默默地初始化
public void foo() {
     if (!inited) {
         init();
     }
     ...
}
Run Code Online (Sandbox Code Playgroud)

大多数这些方法都非常冗长,降低了整体可读性.

java initialization

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