在我们的遗留Java EE应用程序中,有许多值对象(VO)类,它们通常只包含getter和setter,也许equals()和hashCode().这些(通常)是要在持久性存储中保存的实体.(为了记录,我们的应用程序没有EJB - 尽管未来可能会发生变化 - 我们使用Hibernate来持久保存我们的实体.)操作VO中数据的所有业务逻辑都在不同的类中(不是EJB,只是POJO) ).我的OO心态讨厌这个,因为我确实认为给定类的操作应该驻留在同一个类中.所以我强烈要求重构将逻辑转移到相关的VO中.
我刚刚与一位在Java EE方面比我更有经验的同事进行了讨论,并且他证实了愚蠢的实体至少曾经是推荐的方式.不过,他最近也阅读了有关这一立场有效性的意见.
我知道有些问题至少限制了实体类中的内容:
有没有更合理的理由不将逻辑移入我的实体?还是要考虑其他任何问题?
我们的网络应用程序需要符合PCI标准,即不得存储任何信用卡号码.该应用程序是大型机系统的前端,它在内部处理CC号码 - 正如我们刚刚发现的那样 - 偶尔会在其响应屏幕上吐出一个完整的CC号码.默认情况下,这些响应的全部内容都以调试级别记录,并且从这些响应中解析的内容也可以记录在许多不同的位置.所以我无法追捕这些数据泄漏的来源.我必须确保在我们的日志文件中屏蔽了CC编号.
正则表达式部分不是问题,我将重用我们已在其他几个地方使用的正则表达式.但是我找不到有关如何使用Log4J更改日志消息的一部分的任何好的来源.过滤器似乎更受限制,只能决定是否记录特定事件,但不能改变消息的内容.我还发现了Log4J 的ESAPI安全包装API,它初看起来有望实现我的目标.但是,显然我需要用ESAPI记录器类替换代码中的所有记录器 - 这是一个痛苦的屁股.我更喜欢更透明的解决方案.
知道如何屏蔽Log4J输出的信用卡号码吗?
更新:根据@ pgras的最初想法,这是一个有效的解决方案:
public class CardNumberFilteringLayout extends PatternLayout {
private static final String MASK = "$1++++++++++++";
private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})");
@Override
public String format(LoggingEvent event) {
if (event.getMessage() instanceof String) {
String message = event.getRenderedMessage();
Matcher matcher = PATTERN.matcher(message);
if (matcher.find()) {
String maskedMessage = matcher.replaceAll(MASK);
@SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" })
Throwable throwable = event.getThrowableInformation() != null ?
event.getThrowableInformation().getThrowable() : null;
LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
Logger.getLogger(event.getLoggerName()), …Run Code Online (Sandbox Code Playgroud) 我正在实现请求实例的FIFO队列(预先分配的请求对象以获得速度),并在add方法上使用"synchronized"关键字开始.该方法非常短(检查固定大小缓冲区中的空间,然后向数组添加值).使用visualVM看起来线程比我更喜欢阻塞("监视器"准确).因此,我将代码转换为使用AtomicInteger值,例如跟踪当前大小,然后在while循环中使用compareAndSet()(因为AtomicInteger在内部为incrementAndGet()等方法执行).代码现在看起来要长一点.
我想知道的是使用synchronized和更短代码的性能开销与没有synchronized关键字的更长代码相比(因此永远不应该阻塞锁).
这是使用synchronized关键字的旧get方法:
public synchronized Request get()
{
if (head == tail)
{
return null;
}
Request r = requests[head];
head = (head + 1) % requests.length;
return r;
}
Run Code Online (Sandbox Code Playgroud)
这是没有synchronized关键字的新get方法:
public Request get()
{
while (true)
{
int current = size.get();
if (current <= 0)
{
return null;
}
if (size.compareAndSet(current, current - 1))
{
break;
}
}
while (true)
{
int current = head.get();
int nextHead = (current + 1) % requests.length;
if (head.compareAndSet(current, nextHead))
{
return requests[current]; …Run Code Online (Sandbox Code Playgroud) 我正在使用EasyMock(版本2.4)和TestNG来编写UnitTest.
我有一个以下场景,我不能改变定义类层次结构的方式.
我正在测试扩展ClassA的ClassB.
ClassB看起来像这样
public class ClassB extends ClassA {
public ClassB()
{
super("title");
}
@Override
public String getDisplayName()
{
return ClientMessages.getMessages("ClassB.title");
}
}
Run Code Online (Sandbox Code Playgroud)
ClassA代码
public abstract class ClassA {
private String title;
public ClassA(String title)
{
this.title = ClientMessages.getMessages(title);
}
public String getDisplayName()
{
return this.title;
}
}
Run Code Online (Sandbox Code Playgroud)
ClientMessages类代码
public class ClientMessages {
private static MessageResourse messageResourse;
public ClientMessages(MessageResourse messageResourse)
{
this.messageResourse = messageResourse;
}
public static String getMessages(String code)
{
return messageResourse.getMessage(code);
}
}
Run Code Online (Sandbox Code Playgroud)
MessageResourse类代码
public class MessageResourse …Run Code Online (Sandbox Code Playgroud) 在一些个人项目中,我正在慢慢地从PHP5转向Python,我现在很喜欢这种体验.在选择沿着Python路线前,我看了Ruby.我从红宝石社区注意到的是,猴子修补既常见又备受推崇.我也遇到了很多关于调试ruby s/w的试验的恐怖故事,因为有人包括一个相对无害的库来完成一些工作但是修补了一些使用频繁的核心对象而没有告诉任何人.
我选择Python(除了其他原因)之外它的语法更清晰,而且它可以完成Ruby所能做的一切.Python正在使得OO点击比PHP更好,我正在越来越多地阅读OO原则以增强这种更好的理解.
今晚我一直在阅读Robert Martin的SOLID原则:
我目前正在接受O:软件实体(课程,模块,功能等)应该开放扩展,但是为了修改而关闭.
我的头脑是在确保OO设计的一致性和整个猴子修补之间的冲突.我知道可以在Python中进行猴子修补.我也明白,"pythonic"是遵循常见的,经过良好测试的oop最佳实践和原则.
我想知道的是社区对两个对立主题的看法; 他们如何互操作,当它最好地使用一个在另一个上时,是否应该完成猴子修补......希望你能为我提供解决问题的方法.
我在一个可以接受已经创建的PDF文件并直接发送到打印机的库之后.我不希望用户需要安装Adobe Reader或其他任何东西,应用程序将生成PDF并且我想要打印它.
我只是从Emacs的切换到IDEA,这将是一个很大的帮助我,如果我可以使用如Ctrl-A快捷键跳转到行启动.这可能吗?
在SRP中,"责任"通常被描述为"改变的理由",因此每个类(或对象?)应该只有一个人应该去那里并改变它的原因.
但是,如果你把它变成极端细粒度,你可以说一个对象将两个数字加在一起是一个责任,也是一个可能的改变原因.因此,对象不应包含其他逻辑,因为它会产生另一个改变的原因.
我很好奇是否有人有任何"范围"策略,单一责任原则稍微不那么客观?
简单快速的问题,我有这些表:
//table people
| pe_id | pe_name |
| 1 | Foo |
| 2 | Bar |
//orders table
| ord_id | pe_id | ord_title |
| 1 | 1 | First order |
| 2 | 2 | Order two |
| 3 | 2 | Third order |
//items table
| item_id | ord_id | pe_id | title |
| 1 | 1 | 1 | Apple |
| 2 | 1 | 1 | Pear | …Run Code Online (Sandbox Code Playgroud) 我好奇.为什么我必须输入String myStr大写字母而我输入int aNumba小写字母?