我经常发现需要设计具有可配置功能的对象.
举例来说,假设我正在创建一个DateIterator.可配置选项可能是迭代闭合间隔[start, end]还是开放端间隔[start, end).
new DateIterator(boolean openInterval);
Run Code Online (Sandbox Code Playgroud)
new DateIterator(Interval.OPEN_END);
Run Code Online (Sandbox Code Playgroud)
new DateIterator().openEnd();
Run Code Online (Sandbox Code Playgroud)
new OpenEndedDateIterator();
Run Code Online (Sandbox Code Playgroud)
为此我提出了一些我认为较差的替代方案,如基于整数的配置new DateIterator(Interval.OPEN_END);或基于属性的配置.
还有其他方法吗?您更喜欢哪种方法?
我已经设置并配置gitolite并希望为其配置cgitWeb界面.
使用cgit我浏览目录时收到错误:
找不到存储库
创建新存储库时,gitolite会/home/git/repositories自动为其创建相应的目录.cgit被configuered读取使用这些存储库:
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 裸存储库已经创建了?我该如何自动化?
似乎可以解组具有相同名称的两个不同 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)
但是我似乎只得到的情况下无论是 BarA或BarB,取其最后的元素@XmlElementRefs …
给定一个具有分页功能的 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) 为什么下一个代码使用引用类型而不是原始类型?
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
在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中获取方法的所有可能返回值?
例:
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) 我有几个场景,我认为从hibernate文档中有点不清楚.
数据类:
class HibernateDao {
// ...
@Transactional
public void store(List<Object> batch) {
for(Object o : batch) {
hibernate.store(o);
}
}
}
Run Code Online (Sandbox Code Playgroud)
hibernate.jdbc.batch_size = 1
Run Code Online (Sandbox Code Playgroud)
Q1:store(..)使用一组10项目调用时会发生什么?会有10 个 1个交易还是只有一个?
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)?
我们有两个互补的地图代码,如下所示:
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)
我们遇到了这个应用程序的内存问题.看来这里有很多重复.有没有办法让这个内存更有效?我们可以使用一些单一的结构?我意识到这可能是以时间效率为代价的,所以我对权衡利弊感兴趣.
如何管理已存在的对象弹簧?我想把它连接到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
我正在制作一个程序,我声明了一个堆栈并将其命名为"单词".我使用这段代码,如下:
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中调用init方法?我看到的替代方案是
NullPointerExceptionpublic void foo() {
if (!inited) {
throw new IllegalArgumentException("not initalized");
}
...
}
Run Code Online (Sandbox Code Playgroud)
public void foo() {
if (!inited) {
throw new IllegalArgumentException("not initalized");
}
fooInternal();
}
private void fooInternal(){ ... };
Run Code Online (Sandbox Code Playgroud)
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)
大多数这些方法都非常冗长,降低了整体可读性.