我正在研究Java标准库(6)中compare(double,double)的实现.它写道:
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
Run Code Online (Sandbox Code Playgroud)
这个实现的优点是什么?
编辑:"优点"是一个(非常)糟糕的选择.我想知道它是如何工作的.
我有以下代码:
public static void main(String[] args) {
List<String> s = new ArrayList<String>();
s.add("kshitiz");
//This is not typesafe. It should blow up at runtime
List<Integer> i = new ArrayList(s);
System.out.println(i.get(0));
}
Run Code Online (Sandbox Code Playgroud)
这个程序运行正常,并打印kshitiz.如果我用以下内容替换最后一行,它只会失败:
System.out.println(i.get(0).getClass());
Run Code Online (Sandbox Code Playgroud)
例外:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
I'm trying to store a long text file into the DBMS. Here is my table definition :
@Entity
@Table(name = "foos")
public class Foo {
private static final long serialVersionUID = 7111245814238004034L;
@Id
@GeneratedValue
@Column(nullable = false, name = "id")
private long id;
@Lob
@Column(nullable = false, name = "content", length = 100_000)
private String content;
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
Run Code Online (Sandbox Code Playgroud)
And here is my liquibase changeset :
<createTable tableName="foos"> …Run Code Online (Sandbox Code Playgroud) (这里有一个类似的问题,Java XPathFactory thread-safety,但给出的答案是不正确的,因为它忽略了文档声明XPathFactory.newInstance()不是线程安全的事实。)
从XPathFactory Javadoc,我们有:
XPathFactory 类不是线程安全的。换句话说,应用程序有责任确保在任何给定时刻至多有一个线程在使用 XPathFactory 对象。鼓励实现将方法标记为同步以保护自己免受损坏的客户端的影响。
XPathFactory 不可重入。在调用 newInstance 方法之一时,应用程序可能不会尝试递归调用 newInstance 方法,即使是从同一线程。
因此,从上面的引用中,我认为XPathFactory.newInstance()不应同时调用(静态方法)。它不是线程安全的。
工厂返回 XPath 对象,其中包含此XPath Javadoc:
XPath 对象不是线程安全的,也不是可重入的。换句话说,应用程序有责任确保在任何给定时间不会从多个线程使用一个 XPath 对象,并且在调用评估方法时,应用程序可能不会递归调用评估方法。
从上面的报价,我认为XPath.evaluate和XPathExpression.evaluate不应该同时调用。它们不是线程安全的。
通常,当我处理不是线程安全的类时,我只使用局部变量,但因为XPathFactory.newInstance()不是线程安全的,而且它是一个静态方法,我不确定如何安全有效地使用它。我想我可以同步对 的调用newInstance,但我担心性能,因为我的应用程序是一个 XML 消息路由应用程序。(在我的烟雾测试中,newInstance它需要大约 0.4 毫秒。)
我找不到任何以线程安全方式使用 Java XPath 的示例,而且我不确定我知道如何以线程安全但高效的方式使用 XPath。我还需要在单例(特别是Apache Camel Processor)中使用 XPath 的约束。
我可以将自己的POJO注入到这样的托管对象中:
import javax.ejb.Stateless;
import javax.inject.Inject;
@Stateless
public class SomeEjb {
@Inject
private SomePojo somePojo;
}
Run Code Online (Sandbox Code Playgroud)
我有这个POJO:
// No annotations
public class SomePojo {
}
Run Code Online (Sandbox Code Playgroud)
这很好用.如果我将EJB注入JSF支持bean,我可以看到值somePojo是非空值,如预期的那样.
但是,如果我尝试注入java.util.Date到SomeEjb,我得到部署以下异常:
Severe: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:311)
Run Code Online (Sandbox Code Playgroud)
SomeEjb现在:
// No annotations
public class …Run Code Online (Sandbox Code Playgroud) 我正在使用Glassfish 3.1.2.2和JSF Mojarra 2.1.6.
我有以下Facelets页面:
<h:form>
<h:commandLink value="link">
<f:actionListener binding="#{backingBean.someMethod(1)}"/>
</h:commandLink>
</h:form>
Run Code Online (Sandbox Code Playgroud)
以下支持bean:
@RequestScoped
@ManagedBean
public class BackingBean {
public void someMethod(int i) {
System.out.println("It was called: " + i);
}
}
Run Code Online (Sandbox Code Playgroud)
当我单击链接时,控制台中出现"Info:It called called:1".
binding读取文档:
图书馆:http://xmlns.jcp.org/jsf/core,http://java.sun.com/jsf/core(Jsf Core)
标签:actionListener
捆绑
值绑定表达式,其值为实现javax.faces.event.ActionListener 的对象.[强调我的]
此外,该问题的接受答案表明,f:actionListener调用任意方法是不可能的.
如果不支持,为什么调用backing bean方法?
在文件组件的文档中,我看到我们可以通过指定idempotent如下选项来创建幂等读锁:
from("file://inbox?idempotent=true&idempotentRepository=#messageIdRepo")
.to("file:data/outbox");
Run Code Online (Sandbox Code Playgroud)
但在幂等消费者的文档中,我看到我们还可以指定一个幂等处理器,如下所示:
from("file:data/inbox?noop=true")
.idempotentConsumer(header("CamelFileName"), someMessageIdRepository)
.to("file:data/outbox");
Run Code Online (Sandbox Code Playgroud)
这两种创建幂等消费者的方法之间是否存在显着的行为差异?
我们的应用程序包含与支持bean和无状态EJB服务交互的Web页面,但也有一个与无状态EJB服务交互的远程客户端.
许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只能查看某些记录类型); 也就是说,他们使用程序化而非声明性安全性.
在网络方面,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便过滤也适用于远程客户端调用.我可以将SessionBean注入无状态EJB服务,但我认为SessionBeans使用HTTP会话,并且因为在远程客户端调用期间没有HTTP会话,所以我看不出它是如何工作的.
我觉得我的方法是错误的,我应该从容器中检索"Principal"; 但是,由于我们的应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑,而不是以后.
我密切相关的问题:
ps我是Java EE的新手.
技术:
javax.enterprise.context.SessionScopedjavax.ejb.Stateless更新:
有关"远程客户端"的更多详细信息.我不确定如何说这个,因为我是Java EE的新手,但这个"远程客户端"不会通过HTTP.另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息.我认为他们使用证书对客户端进行身份验证.应用程序X将XML转换为POJO并直接调用我的无状态EJB服务.
在这种情况下,我认为我说我不应该SessionBean向StatelessEJB服务注入,因为在应用程序X调用EJB服务时将不会有HTTP会话.我的理解是否正确?
感谢您的耐心等待.我知道我对这些事情的无知.
我正在编写一个自动 bash 脚本,将一些文件从一个目录移动到另一个目录,但第一个目录可能为空:
$ mv somedir/* someotherdir/
mv: cannot stat 'somedir/*': No such file or directory
Run Code Online (Sandbox Code Playgroud)
如果目录为空,如何编写此命令而不产生错误?我应该只使用rmandcp吗?我可以先写一个条件检查来查看目录是否为空,但这感觉超重。
如果目录为空,我很惊讶命令会失败,所以我试图找出我是否缺少一些简单的解决方案。
环境:
java ×7
cdi ×2
ejb ×2
apache-camel ×1
architecture ×1
bash ×1
binding ×1
comparison ×1
el ×1
generics ×1
h2 ×1
hibernate ×1
java-8 ×1
java-ee ×1
jpa ×1
jsf ×1
linux ×1
postgresql ×1
xpath ×1