小编eol*_*old的帖子

将属性值名称存储为字符串常量 - 性能和内存使用情况?

我使用了大约1000个与特定java.util.Properties相关联的属性,这些属性由文件支持.该文件的主要原因是更改它们而不重新编译程序,并允许用户根据自己的喜好调整它们.某些属性仅在代码中的一个位置使用,但有些属性在不同的代码段甚至不同的类中多次使用.

我最近习惯于声明所有那些用作String常量的属性,通常是在一个单独的界面中,如下所示:

public interface AnimalConstants {
  public static final String WEIGHT_PROPERTY = "weight";
  public static final String RUNNING_SPEED_PROPERTY = "speedInKph";
  public static final String HOURS_OF_SLEEP_A_DAY_PROPERTY = "sleepHrs";
  ...
}
Run Code Online (Sandbox Code Playgroud)

当一个类需要访问一些动物属性时,我只是实现了这个接口,我可以访问所有声明的属性常量.当我需要一个特定的属性时,我只使用相应的常量,而不考虑它的确切名称(因为经常使用缩写),更重要的是,这种方式消除了错误输入属性名称的风险.另一个优点是,如果我稍后选择重命名属性以使配置这些属性的高级用户更清楚),我只需要在声明该属性常量的接口中更改该名称(当然还有属性文件) ),所以不需要"搜索和替换"整个项目.最后,我可以轻松检查财产是否被使用; 我只是评论它,编译代码,看看是否有错误.

然而,尽管有这些优点,我很好奇这种方法的缺点是什么.我最感兴趣的是以下内容:

  • 这个方法(1000个字符串常量)对字符串池有什么影响?或者,当我访问这些常量时,它们是按需创建的?这是否会阻止其他字符串在字符串池中缓存?
  • 与使用硬编码字符串常量的方法相比,这种方法的性能成本是多少,是否相同(忽略访问字段的成本)?字符串池的行为是相似还是有很大不同?
  • 这种方法的平均内存增加是多少,所有那些字符串常量一直保存在内存中?

任何好的评论/观察都是受欢迎的.

java string performance properties constants

3
推荐指数
2
解决办法
4734
查看次数

Automake:AM_CFLAGS无效

我试图在Automake中添加一些编译选项,但没有一种方法可行.

这是我的configure.ac:

AC_INIT(...)
AC_PREREQ([2.59])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.10 foreign -Wall no-define])
AC_PROG_CXX
AC_PROG_LIBTOOL
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile test/Makefile])
AC_LANG(C++)
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)

我有父母Makefile.am(在顶级目录):

#AM_CFLAGS = ... # doesn't work
AUTOMAKE_OPTIONS = subdir-objects
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
SUBDIRS = src test
dist_noinst_SCRIPTS = autogen.sh
Run Code Online (Sandbox Code Playgroud)

Makefile.am每个源目录; src/Makefile:

include_HEADERS = ...
lib_LIBRARIES = ...
Run Code Online (Sandbox Code Playgroud)

并且test/Makefile:

#AM_CFLAGS = ... # doesn't work
bin_PROGRAMS = myprog #test
myprog_SOURCES = ...
myprog_LDADD = ../src/libmylib.a
#myprog_CFLAGS = ... # Doesn't work either
Run Code Online (Sandbox Code Playgroud)

我尝试取消注释评论行的所有组合,即:

  • 添加 …

unix automake gcc compilation autotools

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

如何在JPA/Hibernate中基于两个外键生成id?

我在JPA中有一个关于实体声明的简单问题.我有一个带有2个外键的实体,它们不是null并且形成uniqueConstraint.首先,我在考虑一个由两个外键组成的复合键,但我听说这是一个遗留设计,而不是设计新表的推荐方法.

所以我感兴趣的是Hibernate/JPA能否根据两个外键自动生成id.假设我有以下实体:

@Entity
public class Foo {
  @ManyToOne
  private Bar bar;
  private int i;
}
Run Code Online (Sandbox Code Playgroud)

(我省略了not null和uniqueConstraint标签,以使代码更具可读性)

我知道我可以简单地添加一个id字段,与GeneratedValue,并让我的数据库生成密钥(在我的例子的MySQL与AUTO_INCREMENT),但由于涉及查询数据库,并要求它生成唯一的ID,这似乎没有效率的我值.

是否有生成的ID,这是不复合材料的方法(即,int类型或长的)的整数的"I",基于"酒吧"类的ID,和值,因为它这两个值已经形成独特约束?

java hibernate jpa

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

Emacs lisp:从路径获取目录名称(而不是路径)

我要寻找一个简单的便携式获得的目录路径,或从路径目录本身的最后一个组件的方式.函数的语义应该是这样的:

(get-dirname-nonpath "/some/dir/")  ;; should return "dir"
(get-dirname-nonpath "C:\Windows\Path") ;; should return "Path"
(get-dirname-nonpath "/some/path/to/my/source.ext")  ;; returns "my"
Run Code Online (Sandbox Code Playgroud)

在最后一个例子中,如果函数返回"source.ext"而不是"my",那也没关系,特别是如果它会缩短它.查看emacs,我无法找到有助于实现此目的的内置函数:

当然,我可以使用(后退)斜杠进行一些字符串操作,但这看起来很混乱,更像是一个黑客.以强健(OS-oblivious)方式执行此操作的正确方法是什么?

编辑:到目前为止我能找到的最好的是:(file-name-nondirectory (directory-file-name ...))

directory emacs elisp cross-platform path

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

MS Visual C#:接口方法的Eclipse风格自动完成

在实现接口的类中实现接口时,如何自动完成方法签名?

例如,在Eclipse中使用Java时,我只是开始输入名称,我看到一个"缺失"的方法列表,我也可以通过单击鼠标来完成此操作.Visual Studio Express中是否有类似的东西?

c# autocomplete interface visual-studio

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

UNIX 套接字:如何检查 TCP 流是否已关闭以进行读取或 EOF?

我正在编写一个简单的客户端,它通过 TCP 流读取二进制数据。由于文件是逐部分发送的,因此我有一个与此类似的循环:

while (1 /* Maybe a check for EOF or if the socket is closed here ? */) {
  ssize_t bytes_red = recv(
  if (bytes_read <= 0) // not working properly ?
    break;
  ...
}
Run Code Online (Sandbox Code Playgroud)

读取是通过 recv() 方法完成的,该方法返回接收到的字节数。这个想法显然是只要打开 TCP 流就读取数据,但似乎上述方法对我不起作用。

还有其他想法吗?从套接字读取直到流关闭或遇到 EOF 的干净方法是什么?

编辑:上述方法工作正常,我在其他地方有一个错误。

unix sockets tcpclient eof

0
推荐指数
1
解决办法
6779
查看次数