小编Ale*_*ros的帖子

使用try-with-resources而没有新的对象实例坏表单?

一般来说,我总是看到try-with-resources用于分配一个新的对象实例,close()当其超出范围时,该方法的方法被调用.

据我所知,创建一个新对象不是必需的,try-with-resources语法只需要一个局部变量来调用close(),当它超出范围时.因此,您可以使用它来控制"配对操作",例如从池中分配内容并确保返回它.

例如,下面的MyHandle显示了当您不再需要它时如何释放池化实例:

// init
class MyHandle implements AutoCloseable {
    boolean inUse = false; 
    public MyHandle allocate() {
        inUse = true;
        return this;
    }

    public void close() {
       inUse = false;
    }
}

MyHandle[] pool = new MyHandle[POOL_SIZE];
for (int i = 0; i < pool.length; i++) {
    pool[i] = new MyHandle(i);
}

// allocate
MyHandle allocateFromPool() {
    for (int i = 0; i < pool.length; i++) {
        if (!pool[i].inUse)
            return pool[i].allocate();
    }
    throw new …
Run Code Online (Sandbox Code Playgroud)

java try-with-resources

12
推荐指数
1
解决办法
336
查看次数

急切地执行@PostLoad _after_?

使用JPA2/Hibernate,我创建了一个实体A,它具有到实体X的单向映射(见下文).在A中,我还有一个临时成员"t",我试图用@PostLoad方法计算.计算需要访问相关的Xs:

@Entity  
public class A {  
    // ...
    @Transient
    int t;

    @OneToMany(orphanRemoval = false, fetch = FetchType.EAGER)  
    private List listOfX;  

    @PostLoad
    public void calculateT() {
        t = 0;
        for (X x : listOfX)
            t = t + x.someMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试加载此实体时,我收到"org.hibernate.LazyInitializationException:非法访问加载集合"错误.

 at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:363)
 at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
 at org.hibernate.collection.PersistentBag.get(PersistentBag.java:445)
 at java.util.Collections$UnmodifiableList.get(Collections.java:1154)
 at mypackage.A.calculateT(A.java:32)
Run Code Online (Sandbox Code Playgroud)

在调试时查看hibernate的代码(AbstractPersistentCollection.java),我发现:

1)在初始化"listOfX"成员之前调用我的@PostLoad方法
2)Hibernate的代码有一个显式检查,以防止在@PostLoad期间初始化一个急切获取的集合:

 protected final void initialize(boolean writing) {
  if (!initialized) {
   if (initializing) {
    throw new LazyInitializationException("illegal access to loading collection");
   }
   throwLazyInitializationExceptionIfNotConnected();
   session.initializeCollection(this, writing);
  }
 }
Run Code Online (Sandbox Code Playgroud)

我想解决这个问题的唯一方法是停止使用@PostLoad并将初始化代码移动到getT()访问器中,添加一个synchronized块.但是,我想避免这种情况. …

hibernate3 jpa-2.0

11
推荐指数
1
解决办法
4685
查看次数

以编程方式确定 pip '用户安装'位置 脚本目录

正如pip 文档中所解释的,用户可以使用pip install --user <pkg>.

如何以编程方式确定像这样安装的脚本的用户安装位置?我说的是应该添加到 PATH 中的目录,以便可以从命令行调用已安装的包。

例如,在 Windows 中安装时,我收到以下警告,因为我的 PATH 中pip install -U pylint --user没有:'C:\Users\myusername\AppData\Roaming\Python\Python37\Scripts'

...
Installing collected packages: wrapt, six, typed-ast, lazy-object-proxy, astroid, mccabe, isort, colorama, toml, pylint
  Running setup.py install for wrapt ... done
  WARNING: The script isort.exe is installed in 'C:\Users\myusername\AppData\Roaming\Python\Python37\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts epylint.exe, pylint.exe, pyreverse.exe …
Run Code Online (Sandbox Code Playgroud)

python pip

10
推荐指数
1
解决办法
4050
查看次数

JAXB:空字符串不会产生空元素

我正在使用Sun的JDK 1.6.0_18中的JAXB 2.1.10:

D:\ apps\jdk160_18\bin> xjc.exe -version xjc版本"JDK 6中的JAXB 2.1.10"用于XML绑定的JavaTM体系结构(JAXB)参考实现,(在JDK 6中构建JAXB 2.1.10)

当JAXB对象具有空字符串()的值时,我需要让JAXB的marshaller生成一个空元素(例如<someStringField></someStringField>或).但是,JAXB并没有这样做,而是从输出中省略了元素(就好像它是一个可选元素).<someStringField/>""

我在Internet上的搜索表明,只要将字段设置为非空的空字符串(即myJAXBObject.setSomeStringField("");),JAXB通常应该创建此标记:

如何使用JAXB实例化一个空元素 https://jaxb.dev.java.net/tutorial/section_2_2_12_8-No-Value.html#No%20Value

在我的XSD中,我试图表明(我知道的每一种方式)元素的存在是强制性的,即使它是空的:

      <xs:element name="outerElement">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="someStringField" type="xs:string" nillable="false" minOccurs="1" />
            <xs:element name="someOtherStringField" type="xs:string" />
Run Code Online (Sandbox Code Playgroud)

生成的代码看起来像这样(两个元素都是一样的):

    @XmlElement(name = "someStringField", required = true)
    protected String someStringField;
    @XmlElement(name = "someOtherStringField", required = true)
    protected String someOtherStringField;
Run Code Online (Sandbox Code Playgroud)

但是,当我编组以下对象时......

outerElement.setSomeStringField("");
outerElement.setSomeOtherStringField("Value was set");
Run Code Online (Sandbox Code Playgroud)

我明白了:

<outerElement>
           <someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)

当我期待:

<outerElement>
           <someStringField></someStringField>
           <someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)

要么:

<outerElement>
           <someStringField/>
           <someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)

谁能发现我做错了什么?

jaxb

6
推荐指数
1
解决办法
5165
查看次数

在Scala中合并大集(HashSet)

我有两个巨大的(如数百万个条目)集合(HashSet),它们之间有一些(<10%)重叠.我需要将它们合并为一组(我不关心维护原始集合).

目前,我将一组中的所有项目添加到另一组:

setOne ++= setTwo
Run Code Online (Sandbox Code Playgroud)

这需要几分钟才能完成(在几次尝试调整成员的hashCode()之后).

任何想法如何加快速度?

collections scala scala-collections

6
推荐指数
1
解决办法
2411
查看次数

既然 tools.jar 在 Java 9 中被分解了,sun.misc.Perf 移到哪里去了

sun.misc.Perftools.jar和在Java中这9取出并基于模块概念重组,因此,问题是你如何访问它在新的Java?我需要知道哪个模块现在包含此代码。

java java-9 java-module

6
推荐指数
1
解决办法
468
查看次数

maven 如何决定何时将目标文件夹用于类路径

我有一个关于 maven 如何在构建过程中计算类路径的问题。具体来说,什么控制何时使用“目标/类”以及何时使用存储库(本地/远程)中的“jar”。

我在版本 1.0.0-SNAPSHOT 上有一个项目,其中尚未安装/部署工件,因此某些存储库(远程或本地)中没有“jar”来解决它们。我想运行“generate-sources”而不在本地安装(没有' mvn install'运行)。

结构如下所示:

parent-prj
parent-prj/sub-prj
parent-prj/gen-src-prj <--- This depends on 'sub-prj'
Run Code Online (Sandbox Code Playgroud)

当我运行“ mvn -am -pl parent-prj/gen-src-prj generate-sources”以生成一些java文件时,它不起作用:

[ERROR] Failed to execute goal on project gen-src-prj: Could
 not resolve dependencies for project 
mygrp:gen-src-prj:jar:1.0.0-SNAPSHOT: 
Could not find artifact 
mygrp:sub-prj:jar:1.0.0-SNAPSHOT -> [Help 1]
Run Code Online (Sandbox Code Playgroud)

使用调试输出并添加“dependency:build-classpath”,我可以确认 maven 忽略了反应器中“sub-prj”的存在,并在它找不到的地方寻找“jar”。然而,该项目打印在反应堆摘要中:

[INFO] Reactor Summary:
[INFO] 
[INFO] parent-prj ..................................... SUCCESS [  0.625 s]
[INFO] sub-prj ........................................ SUCCESS [  0.018 s]
[INFO] gen-src-prj .................................... FAILURE [  0.040 s]
Run Code Online (Sandbox Code Playgroud)

我注意到的有趣的事情是运行 compile 目标工作正常!这使用sub-prj/target/classes …

maven-3 maven exec-maven-plugin

5
推荐指数
2
解决办法
4952
查看次数

当虚拟环境处于活动状态时,Windows“Python 启动器”无法检测到某些 shebangs 的 python3

我一直使用#!/usr/bin/env python3我的 python 脚本,因为 Debian 发行版通常用于python版本 2.7 和python3版本 3.x,并且更改此约定可能会导致系统出现问题(例如,请参阅这个 SO 问题How to update-alternatives to Python 3 without Breaking)合适吗?)。

但是,我无法让它在 Windows 上正常工作。考虑一台带有标准 python 的机器(从https://www.python.org/downloads/下载)并以管理员身份为所有用户安装。这是一个打印可执行文件和(基本)前缀的脚本:

#!/usr/bin/env python3
import os, sys, platform
print('EXECUTABLE: ' + sys.executable)
print('PREFIX: ' + sys.prefix)
print('BASE PREFIX: ' + sys.base_prefix)
Run Code Online (Sandbox Code Playgroud)

现在看看以下内容:

PS C:\pytest> gcm python | select Source
C:\Program Files\Python37\python.exe

PS C:\pytest> gcm python3 | select Source
C:\Users\user\AppData\Local\Microsoft\WindowsApps\python3.exe
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Windows 上的 python3.exe 是一个“存根”,它会在页面上打开 Microsoft Store 以从中安装 Python。我提到这一点是为了防止它很重要。但是,运行上面的脚本会给出正确的结果:

PS C:\pytest> …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-venv

5
推荐指数
0
解决办法
1047
查看次数

决定是否在 pip-tools 中允许不安全的包版本的正确方法是什么?

我正在尝试使用 pip-tools 来管理 venv(如python -m venv .venv)环境。新激活的环境最初只有 pip-tools:

> pip list
Package   Version
--------- -------
Click     7.0
pip       19.3.1
pip-tools 4.2.0
six       1.13.0
Run Code Online (Sandbox Code Playgroud)

我创建了一个requirements/main.in文件:

numpy
matplotlib
Run Code Online (Sandbox Code Playgroud)

跑步pip-compile --upgrade --build-isolation --generate-hashes --output-file requirements/main.txt requirements/main.in给了我这个警告:

# WARNING: The following packages were not pinned, but pip requires them to be
# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag.
# setuptools==41.6.0        # via kiwisolver
The generated requirements file may be rejected by pip …
Run Code Online (Sandbox Code Playgroud)

python pip pip-tools

3
推荐指数
1
解决办法
1754
查看次数

Yeoman源文件夹(在版本控制中导入什么)

我是Yeoman/Grunt/Bower的新手,我想让一些知识渊博的人告诉我将生成的脚手架导入版本控制的最佳做法是什么.

例如,我使用版本1.0.7-pre.2的Yeoman创建了一个带有"yo angular"的角度项目,显然有一些东西可以通过bower/npm下载,这是"安全的"以防止源代码控制, 喜欢:

  1. 文件夹"node_modules"(可以使用"npm update"重新创建)
  2. 文件夹"app/bower_components"(可以使用"bower update"重新创建)

还有什么其他东西应该不受源代码控制吗?

是否有一些干净的任务会自动删除所有这些文件?(我发现了"咕噜咕噜",但这似乎让bower_components和npm_modules完好无损).

是否有一些脚手架会产生"最佳实践".gitignore?

提前致谢.

yeoman

2
推荐指数
1
解决办法
410
查看次数

隐式参数和ClassTag

有人可以通过下面的错误消息解释Scala编译器试图告诉我的内容吗?

object Some {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = data
}
object Other {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T =
    Some(data)(ordering.reverse)
}
Run Code Online (Sandbox Code Playgroud)

编译说:

not enough arguments for method apply: (implicit evidence$2: scala.reflect.ClassTag[T], implicit ordering: Ordering[T])T in object Some. Unspecified value parameter ordering.
Run Code Online (Sandbox Code Playgroud)

当我ClassTag在对象中添加方法时,出现错误Some,以便在那里使用一些内部数组.最初,代码是(并且编译没有错误):

object Some {
  def apply[T](data: T)(implicit ordering: Ordering[T]): T = data
}
object Other {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T =
    Some(data)(ordering.reverse)
}
Run Code Online (Sandbox Code Playgroud)

我知道ClassTag添加一个隐含的类型信息来克服擦除,但我不明白这与我的排序隐式参数有什么关系,或者为什么编译器突然认为排序没有价值......

scala scala-2.10

2
推荐指数
1
解决办法
2490
查看次数