据我所知,在一个Set中只允许根据.equals()的任何对象的一个实例,如果你已经拥有一个等效的对象,你不应该"需要"从Set中获取一个对象,但我仍然希望有一个.get()方法,它给出一个等效对象作为参数的Set(或null)中对象的实际实例.
关于它为什么这样设计的任何想法/理论?
我通常不得不通过使用Map并使键和值相同或类似的东西来解决这个问题.
编辑:到目前为止,我认为人们不理解我的问题.我想要已经在集合中的确切对象实例,而不是可能不同的对象实例,其中.equals()返回true.
至于为什么我会想要这种行为,通常.equals()不会考虑对象的所有属性.我想提供一些虚拟查找对象并获取Set中的实际对象实例.
以下不起作用:
@Entity
class Owner {
@OneToMany(mappedBy="owner", cascade = {CascadeType.ALL})
protected Set<B> getBSet() {
..
}
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
class A {
@ManyToOne
public Owner getOwner() {
...
}
}
@Entity
class B extends A {
}
Run Code Online (Sandbox Code Playgroud)
它会导致异常:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性:所有者中的B.user.
我试图避免将"owner"属性复制到B类(因此将"非规范化"并将所有者密钥复制到为实体A和B生成的两个表中).另外,我真的希望将A和B放在一个单独的表中,而不必使用SingleTable继承来使用鉴别器.
另外,我无法弄清楚如何通过在A和B之间使用@OneToOne来做类似的事情(并且没有B扩展A).
提供以下代码:
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
HashMap<String, Object> dataMap = new HashMap<>();
dataMap.put("longvalue", 5L);
class TestMethodHolder {
<T> T getValue(Map<String, Object> dataMap, String value) {
return (T)dataMap.get(value);
}
}
hashMap.put("test", new TestMethodHolder().<String>getValue(dataMap, "longvalue"));
String value = hashMap.get("test"); // ClassCastException occurs HERE
System.out.println(value);
}
Run Code Online (Sandbox Code Playgroud)
我编译这段代码并不奇怪,而是ClassCastException出现在get行上而不是它上面的put行,尽管我确实有一个有根据的猜测,可能会发生什么.由于泛型类型在运行时被擦除,因此getValue()中的强制转换实际上永远不会在运行时发生,并且实际上是对Object的强制转换.如果该方法将在下面实现如下,那么将发生运行时强制转换并且它将在put行上失败(如预期的那样).谁能证实这一点?
class TestMethodHolder {
String getValue(Map<String, Object> dataMap, String value) {
return (String)dataMap.get(value);
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用泛型的已知缺陷还是奇怪?那么在调用方法时使用<>表示法是不好的做法?
编辑:我使用的是默认的Oracle JDK 1.7_03.
上面提到的另一个隐含问题:原始getValue STILL中的强制转换是在运行时发生的,但是强制转换实际上是对象 - 或者编译器是否足够聪明,以便在运行时不会发生此强制转换?这可能解释了人们在运行时注意到ClassCastException发生的位置的差异.
我知道如何在ANT中运行单个目标,但它也会检查"depends"属性并在目标之前运行它们.有没有办法防止这种或一种方式来构建我的ANT文件,以便我可以更容易地做到这一点?
人们几乎都会使用防御性的吸气者/安装者吗?对我来说,99%的时间打算将您在另一个对象中设置的对象作为同一对象引用的副本,并且您打算对其所做的更改也在其设置的对象中进行.如果你setDate ( Date dt )以后修改dt,谁在乎呢?除非我想要一些基本的不可变数据bean,它只有原语,也许像Date一样简单,我从不使用它.
就克隆而言,复制的深度或浅度存在问题,因此知道克隆对象时会出现什么样的"危险".我想我只使用clone()过一次或两次,那就是复制对象的当前状态,因为另一个线程(即访问Session中同一个对象的另一个HTTP请求)可能正在修改它.
编辑 - 我在下面发表的评论更多的问题是:
但话说回来,你DID改变日期,所以这是你自己的错,因此整个讨论术语"防守".如果在中小型开发人员组中,您自己控制的是所有应用程序代码,那么仅仅记录您的类是否足以作为制作对象副本的替代方法?或者这不是必需的,因为你应该总是假设在调用setter/getter时没有被复制的东西?
可能重复:
布尔值,条件运算符和自动装箱
Java,Google Collections Library; AbstractIterator有问题吗?
下面的代码产生一个NPE:
Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)
要正确打印出"null"而无异常,需要以下代码:
Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)
在第一个例子中显而易见的是,"test"被取消装箱(转换为原生int),但为什么呢?为什么更改三元运算符中的另一个表达式(如第二个示例中)修复它?任何人都可以提供某种形式的叙述,确切地知道两个例子中的内容何时,什么以及为何被盒装和取消装箱?
我想将值减一,如果它达到零,则将其设置为最大值.有没有办法通过数学来做到这一点而不诉诸if (n-1 == 0) { n = max; }
将值增加1然后在大于max时将其设置为零的相反情况可以很容易地实现n = (n + 1) % (max + 1);.此外,这甚至更好,因为你可以增加任何数量(不只是一个),它仍然会"正确""包裹".
谢谢你到目前为止的答案.要清楚,我的意思是没有任何布尔逻辑(if/else)或布尔运算符(!,&&等).我只是好奇如何做到这一点.只要提供评论,下面的正确答案是否真的让它更难以理解?对于更一般的情况,有必要使用它来减去任意数字并期望正确的环绕.
无论什么时候<c:set var="name" value="1"/>,#{name}总是一个字符串,如下所示#{name.class}.
有没有办法在JSF/Facelets上下文中设置作为Integer或Long文字值的作用域属性?
我通常总是发现使用标题中列出的接口的具体类就足够了.通常当我使用其他类型(例如LinkedList或TreeSet)时,原因是功能而不是性能 - 例如,队列的LinkedList.
我有时构造的ArrayList的初始容量大于默认值10,HashMap的默认值大于16,但我通常(特别是对于业务CRUD)从未看到自己在想"嗯...我应该使用LinkedList而不是ArrayList,如果我要插入并遍历整个List?"
我只是想知道这里的其他人使用什么(以及为什么)以及他们开发的应用程序类型.
在Netbeans或Eclipse中,您可以使用右键单击上下文菜单中的"查找用法"或"引用".如果a()调用b(),则使用b()中的函数将显示a().但是,我想要的是能够看到某种树或有一个选项来查看给定/类或方法的所有用法,这样如果z()调用a()使用该功能将显示两个z( )和a().
任何可以执行此操作的IDE插件或外部工具?
我一直指的是以下页面:
http://msdn.microsoft.com/en-us/library/ms178129.aspx
我只想从具有Unicode字符的文件批量导入一些数据.我已经尝试在UC-2,UTF-8等中编码实际数据文件,但没有任何作用.我还修改了要使用的格式文件SQLNCHAR,但它仍然不起作用并给出错误:
第1行第1列的批量加载数据转换错误(截断)
我认为这与上述链接中的这个陈述有关:
对于使用Unicode字符数据文件的格式文件,所有输入字段必须是Unicode文本字符串(即固定大小或字符终止的Unicode字符串).
这到底是什么意思?我认为这意味着每个字符串需要一个固定的2个字节,在UCS-2中编码文件应该处理???
鉴于以下内容:
@Entity
public class Parent implements Serializable {
@Id
private Long id;
// mapped ManyToOne below...
private List<Child> children = new ArrayList<Child>();
...
}
Run Code Online (Sandbox Code Playgroud)
让Parent.equals()和Parent.hashCode()仅使用id是不好的做法?我知道Child.equals()和Child.hashCode()应该为"自然键"使用一组不可变的属性,以便它们由Parent正确管理.但是,如果Parent始终是顶级对象(即它永远不是任何关联的反面),那么仅使用id是否有任何问题?
通过这样做,是否有任何可能表现出来的不良影响?我猜也许如果我这样做,当我添加一个子(或删除)时,Hibernate将无法告诉父更改(并且需要在DB中更新)?在这种情况下,我应该使用Parent.equals()和Parent.hashCode()的children属性吗?
我问,因为Hibernate docs明确表示不要将@Id属性用于"自然键"......
例如:
> function foo() {
> jQuery(whatever).each( function() {
return; // this just exits the anonymous function - is there a way to return from foo?
}
);
>
> }
Run Code Online (Sandbox Code Playgroud)