在clone不实现 Cloneable 接口和不调用 super.clone() 的情况下重写方法是否是一个好习惯。这样,CloneNotSupportedException就不会抛出异常。
考虑这个类:
class Money {
private BigDecimal x ;
public Object clone() {
Money m1 = new Money();
m1.setX(this.x);
return m1;
}
public BigDecimal getX() {
return x;
}
public void setX(BigDecimal x) {
this.x = x;
}
}
Run Code Online (Sandbox Code Playgroud)
这个类不会抛出CloneNotSupportedException,它就像一个复制构造函数。
这是一个好方法吗?
我想在我的实体中将一组选项表示为EnumSet,并在我的数据库中表示为一对多关系.这怎么做得好?我只能找到不使用两个表的旧(预注释)答案或答案.
我定义了以下表格:
CREATE TABLE Users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
CREATE TABLE User_Options (
user_id INT,
user_option VARCHAR(255),
PRIMARY KEY (user_id, user_option),
FOREIGN KEY (user_id) REFERENCES Users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
这个实体类:
@Entity(name = "Users")
public final class User {
@Id
@GeneratedValue
private int id;
@Column(nullable = false, unique = true)
private String name;
private final Set<UserOption> options;
{
this.options = EnumSet.noneOf(UserOption.class);
}
/* plain getter for id included */
/* …Run Code Online (Sandbox Code Playgroud) 我正在以下列方式启动一个过程.
try {
final Process mvnProcess = new ProcessBuilder("cmd", "/c", "mvn", "--version")
.directory(new File(System.getProperty("user.dir")))
.inheritIO()
.start();
System.exit(mvnProcess.waitFor());
} catch (final IOException ex) {
System.err.format(IO_EXCEPTION);
System.exit(1);
} catch (final InterruptedException ex) {
System.err.format(INTERRUPTED_EXCEPTION);
System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
自从我调用后,inheritIO()我期待控制台上的子进程输出,但什么都没有出现.我在这里错过了什么?
编辑:我知道我可以mvnProcess.getInputStream()显式地使用和读取进程的输出,将其写入循环中的控制台(或其中).我不喜欢这个解决方案,因为循环会阻塞我的线程.inheritIO()看起来很有希望,但显然我不明白它是如何工作的.我希望有人可以对此有所了解.
我想说服Maven"继续它离开的地方".我首先做一个mvn package构建包.稍后我可能希望通过执行a来继续生命周期来进行集成测试等mvn install.在这种情况下,我希望Maven不要从一开始就重新开始生命周期,而是在第一阶段package(即pre-integration-test)之后重新开始.是否有可能在第一阶段以外的阶段开始生命周期?
在 shell 脚本中,我试图对 CSV 文件进行排序。某些字段可能包含分隔符并被引用以正确处理此问题。假设我有一个文件:
"2",D,Clair
1,R,Alice
"3","F","Dennis"
2,"P,F",Bob
Run Code Online (Sandbox Code Playgroud)
我想在第一列上排序,然后是第三列。结果应该是:
1,R,Alice
2,"P,F",Bob
"2",D,Clair
"3","F","Dennis"
Run Code Online (Sandbox Code Playgroud)
字段中也可能有转义的双引号。通常,CSV 将符合RFC 4180。
我试图用 a 来做到这一点,sort -t , -k 1,1 -k 3,3但这不起作用,因为sort不知道 CSV 中引号的特殊含义。我找不到一种方法来sort表现这种方式。也许我应该使用另一个命令,但我找不到任何命令。
如何对我的 CSV 进行排序?
我正在为REST端点创建一个服务客户端,将JAX-RS客户端用于HTTP请求,并使用Jackson来(反)序列化JSON实体。为了处理JSR-310(Java8)日期/时间对象,我将该com.fasterxml.jackson.datatype:jackson-datatype-jsr310模块作为对服务客户端的依赖项添加,但是我没有使它起作用。
如何配置JAX-RS和/或Jackson使用jsr310模块?
我使用以下依赖项:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${jax-rs.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我不想使服务客户端(以库形式发布)依赖于任何特定的实现(例如Jersey),因此我仅依赖于JAX-RS API。为了运行集成测试,我添加了:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
JAX-RS客户端的实例化是在工厂对象中完成的,如下所示:
import javax.ws.rs.Produces;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
@Produces
public Client produceClient() {
return ClientBuilder.newClient();
}
Run Code Online (Sandbox Code Playgroud)
典型的DTO如下所示:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.time.Instant;
import static java.util.Objects.requireNonNull;
@JsonPropertyOrder({"n", "t"})
public final class Message {
private final String name;
private final …Run Code Online (Sandbox Code Playgroud) 假设我想在svg中绘制一个sqare,其对角线为1.这意味着正方形的边长度为a = 1/sqrt(2).方形的顶点的坐标,然后将是:(0,0),(0,a),(a,0)和(a,a).当然我可以a用十进制数近似并使用这个数字.但是,如果我希望顶点在数学上是精确的,例如因为我希望它们完全在某条线上,我知道要经过预期的点?
我是SVG的新手.我正在阅读这里的转换,希望得到一些指示,但它让我感到困惑.
有谁知道这是否可以做到,如果可以,怎么做?
可能重复:
for循环优化
假设我们想循环遍历字符串的字符s.我会说以下代码或多或少是默认代码.
for( int i = 0; i < s.length(); i++ ) {
doSomethingWith( s.charAt( i ) );
}
Run Code Online (Sandbox Code Playgroud)
问题1:为什么我经常看到以下内容?
final int length = s.length();
for( int i = 0; i < length; i++ ) {
doSomethingWith( s.charAt( i ) );
}
Run Code Online (Sandbox Code Playgroud)
乍一看,这似乎是合理的,因为在每次迭代时都会评估不等式.但是我希望VM能够优化它,因为字符串是不可变的.有什么想法吗?如果我们迭代一个可变结构(没有被任何其他线程引用)会怎样?如果length()不能保证在O(1)中运行怎么办?
问题2:有些人认为代++i的i++速度可达代码.他们是对的吗?这不是我所期望的,但我只是不确定.
我们都知道不要过早优化.与此同时,如果我们几乎不用任何代价就可以生成稍微快一点的代码,那么我们就不会傻了.当然,人们可能会争辩说,两种"优化"都会损害可读性,但在我看来,损害是如此之小,以至于在某些情况下这种损害是合理的.
我试图衡量性能上的任何差异,但很难得出确凿的结果.虽然这应该适用于任何特定的应用程序,但我的目标是洞察力和一般答案.
(虽然我在考虑HotSpot VM的情况下编写了这个内容,但考虑其他平台,如移动设备也会很有趣.)
请考虑以下界面.
public interface Feed<T> {
public void put( T o );
}
Run Code Online (Sandbox Code Playgroud)
我们有一个简单的Java类来实现这个接口,它将对象写入特定的集合.
public class CollectionFiller<T> implements Feed<T> {
private final Collection<T> collection;
private CollectionFiller( Collection<T> collection ) {
this.collection = collection;
}
public void put( T o ) {
this.collection.add( o );
}
public static <T> CollectionFiller<T> of( Collection<T> collection ) {
return new CollectionFiller<T>( collection );
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们定义两个虚拟类,以使问题具体化.
public class Super {}
public class Sub extends Super {}
Run Code Online (Sandbox Code Playgroud)
比方说,有一些方法writeSubsTo( Feed<Sub> f ),我们有一个实例cf的CollectionFiller<Super> …
我想用 Logback 拦截 Jersey 的日志记录,但我不确定如何。有人可以指点一下吗?
使用shell命令,我想要反转文本文件的行,不包括标题行.
Number,Letter,Person
1,a,Alice
2,b,Bob
3,c,Claire
Run Code Online (Sandbox Code Playgroud)
应该成为
Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice
Run Code Online (Sandbox Code Playgroud)
我在寻找两个 "就地"解决方案(修改原文件)和流媒体解决方案(从stdin读取和打印结果原来的文件到标准输出).
理想情况下,命令或脚本与POSIX兼容,但其他解决方案也可能很有趣.一个oneliner会很好.
我也对任何解决方案的性能/复杂性感兴趣.