我使用了大约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)
当一个类需要访问一些动物属性时,我只是实现了这个接口,我可以访问所有声明的属性常量.当我需要一个特定的属性时,我只使用相应的常量,而不考虑它的确切名称(因为经常使用缩写),更重要的是,这种方式消除了错误输入属性名称的风险.另一个优点是,如果我稍后选择重命名属性以使配置这些属性的高级用户更清楚),我只需要在声明该属性常量的接口中更改该名称(当然还有属性文件) ),所以不需要"搜索和替换"整个项目.最后,我可以轻松检查财产是否被使用; 我只是评论它,编译代码,看看是否有错误.
然而,尽管有这些优点,我很好奇这种方法的缺点是什么.我最感兴趣的是以下内容:
任何好的评论/观察都是受欢迎的.
我试图在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)
我尝试取消注释评论行的所有组合,即:
我在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,和值,因为它这两个值已经形成独特约束?
我要寻找一个简单的和便携式获得的目录路径,或从路径目录本身的最后一个组件的方式.函数的语义应该是这样的:
(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 ...))
在实现接口的类中实现接口时,如何自动完成方法签名?
例如,在Eclipse中使用Java时,我只是开始输入名称,我看到一个"缺失"的方法列表,我也可以通过单击鼠标来完成此操作.Visual Studio Express中是否有类似的东西?
我正在编写一个简单的客户端,它通过 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 的干净方法是什么?
编辑:上述方法工作正常,我在其他地方有一个错误。