使用hibernate的一个挑战是manged类必须有一个默认的构造函数.问题是没有明确的点来初始化类并且可以检查不变量.
如果一个类具有依赖于多个属性的不变量,则类设计变得复杂.让我们从假设的绿地设计开始:
public class A {
private int x;
private int y;
public A(int x, int y) {
this.x = x;
this.y = y;
checkInvariants(this.x, this.y);
}
private void checkInvariants(int x, int y) {
if (x + y « 0) throw new IllegalArgumentException();
}
}
Run Code Online (Sandbox Code Playgroud)
这是不符合hibernate要求的基本实现.在构造函数中检查不变量.(checkInvariants()方法的内容并不重要,它仅用于说明类不变量可以依赖于多一个属性.)
该类可以使用如下:
new A(0, 0);
new A(-1, 0); //invalid
Run Code Online (Sandbox Code Playgroud)
要满足hibernate要求,一种解决方法是添加私有默认构造函数并使用字段访问.(我省略了hibernate映射.)
public class H {
int x;
int y;
public H(int x, int y) {
this.x = x;
this.y = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个工具,它使用注释处理器根据注释类的方法的返回类型生成源代码.返回类型始终A是定义类型变量的接口的某个子类型(接口或类)T.
interface A<T>{T m();};
Run Code Online (Sandbox Code Playgroud)
我想找到方法m()返回值类型变量的类型参数T.
返回类型由注释处理器表示为javax.lang.model.type.TypeMirror实例.最简单的情况是A<T>直接返回.
@SomeAnnotation
class SomeClass{
A<T> x();
}
Run Code Online (Sandbox Code Playgroud)
要找到的处理器代码T非常简单.(我会在这里投射而不是使用访问者API来保持代码简单.)
DeclaredType type = (DeclaredType) typeMirror;
TypeMirror t = type.getTypeArguments().get(0);
Run Code Online (Sandbox Code Playgroud)
在TypeMirror返回类型的是javax.lang.model.type.DeclaredType和T是第一个类型参数.其结果t是一javax.lang.model.type.TypeVariable对T.同样适用于具体的返回类型A<B>(B某种类型:) interface B{}.结果t是DeclaredType代表B.
其他结果类型开始变得复杂:
interface Subtype<T> extends A<T>{}
interface Concrete extends A<B>{};
interface Multiple<B,T> extends A<T>{}
interface Bounds<T extends B> extends …Run Code Online (Sandbox Code Playgroud) 我在Scala语言规范(3.2.10存在类型)中遇到了关于值的存在量化.
x: y.Inner forSome{val y : Outer}
Run Code Online (Sandbox Code Playgroud)
有人有说明性的用例吗?
T forSome {val x: S}被定义为T forSome { type t <: S with Singleton }.Singletron特性在规范(3.2.1单例类型)中提到,但我在Scaladoc中找不到它.它在哪里定义?
我正在尝试将命令的输出转换为echo -e "a b\nc\nd e"数组.
X=( $(echo -e "a b\nc\nd e") )
Run Code Online (Sandbox Code Playgroud)
拆分每个新行和空白字符的输入:
$ echo ${#X[@]}
> 5
for i in ${X[@]} ; do echo $i ; done
a
b
c
d
e
Run Code Online (Sandbox Code Playgroud)
结果应该是:
for i in ${X[@]} ; do echo $i ; done
a b
c
d e
Run Code Online (Sandbox Code Playgroud) 我写了一个有地图的类<String, Object>.我需要它来保存任意对象,但有时我需要投射一些这些对象,所以我会做类似的事情
HashMap<String, Object> map = new HashMap<String, Object>();
Object foo = map.get("bar");
if (foo instanceof HashMap) {
((HashMap<String, Integer>) foo).put("a", 5);
}
Run Code Online (Sandbox Code Playgroud)
这给出了警告
Stuff.java:10: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.HashMap<java.lang.String,java.lang.Integer>
((HashMap<String, Integer>) foo).put("a", 5);
Run Code Online (Sandbox Code Playgroud)
我怀疑它与泛型的使用有关.我可以使用@SupressWarnings("unchecked")摆脱错误,但我想知道是否有更好的方法来做到这一点.或许我得到警告的事实意味着我应该重新考虑我正在做的事情.有什么我可以做的,或者我应该只使用@SupressWarnings?
有没有办法使用具有休眠持久性映射的Flyweight对象?我的数据模型包含许多相同的对象.我不想为每个相同的对象设置单独的实例,而是使用Flyweight设计模式并始终引用相同的物理对象.如何在hibernate中实现这一点?
顺便说一句.所有JVM都以某种方式优化字符串的使用,这样当多次使用相同的字符串时,它总是相同的物理实例?
如何实现Numeric [T]的子类型?我一直在寻找这方面的指南,但没有找到任何.子类型的例子可能是Rational还是Complex?
在此先感谢Troels
我传递了一个对象集合(在我的情况下是一些Contact类),需要从该集合返回一个页面.我的代码感觉比它需要的时间长得多.我是否缺少一些可以执行更优雅的库,而不是像下面一样一次迭代每个元素?
protected Collection<Contact> getPageOfContacts(
Collection<Contact> contacts, int pageIndex, int pageSize) {
if (pageIndex < 0 || pageSize <= 0
|| pageSize > contacts.size()) {
return contacts;
}
int firstElement = pageIndex * pageSize;
int lastElement = (pageIndex + 1) * pageSize - 1;
Collection<Contact> pagedContacts = new ArrayList<Contact>();
int index = -1;
for (Contact contact : contacts) {
index++;
if (index < firstElement) {
continue;
}
if (index > lastElement) {
break;
}
pagedContacts.add(contact);
}
return pagedContacts;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用java servlet实现一个长轮询http连接.
我怎么知道http客户端在任何情况下都仍然有效?目前,我所做的是将一个字节写入输出流并刷新数据.如果存在IO异常,则客户端已经死亡.
但是在ASP.NET中有一个属性,Response.IsClientConnected可以查看客户端是否处于活动状态而不向输出流写入任何内容.
我想知道如何在java servlet中开发.我不想继续将数据写入http响应流,因为它可能会花费网络成本.
提前致谢.