与此问题类似......
您在Java代码中实际发现的最差实践是什么?
我的是:
在servlet中使用实例变量(实际上这不仅仅是不好的做法,而是bug)
使用像HashMap这样的Collection实现,而不是使用适当的接口
使用看似神秘的类名,如SmsMaker(SmsFactory)或CommEnvironment(CommunicationContext)
asalamon74.. 96
我必须维护java代码,其中大多数异常处理如下:
catch( Exception e ) {}
不幸的是,我目前的项目做得更糟:`catch(Throwable th){logger.log("出错了"); }` (26认同)
人们也这样做:catch(例外e){//不会发生} :) (19认同)
我承认,在使用Oracle的JDBC时,我写了catch(SQLException ex){/*什么可能被抛出?*/}关闭连接时. (8认同)
嘿,这在C#代码中也很常见. (5认同)
Java经常要求您捕获永远不会发生的异常.例如,从ByteArrayInputStream读取IOException - 假设您可以控制所述ByteArrayInputStream的创建. (4认同)
"扔掉"异常的人应该受到惩罚! (2认同)
这将打开整个"已检查与未经检查的例外"辩论!:) (2认同)
甚至更糟 - "捕捉(Throwable t){}` (2认同)
Peter Štibra.. 38
一旦遇到'singleton'异常:
class Singletons { public static final MyException myException = new MyException(); } class Test { public void doSomething() throws MyException { throw Singletons.myException; } }
每次抛出相同的异常实例 ...与完全相同的堆栈跟踪,与实际代码流无关:-(
我必须维护java代码,其中大多数异常处理如下:
catch( Exception e ) {}
一旦遇到'singleton'异常:
class Singletons { public static final MyException myException = new MyException(); } class Test { public void doSomething() throws MyException { throw Singletons.myException; } }
每次抛出相同的异常实例 ...与完全相同的堆栈跟踪,与实际代码流无关:-(
六个非常糟糕的例子;
而不是错误报告,只是
System.exit
没有警告.例如
if(properties.size()>10000) System.exit(0);
埋在图书馆的深处.
使用字符串常量作为锁.例如synchronized("one") { }
.
锁定可变字段.例如synchronized(object) { object = ...; }
.
在构造函数中初始化静态字段.
触发异常只是为了获得堆栈跟踪.例如try { Integer i = null; i.intValue(); } catch(NullPointerException e) { e.printStackTrace(); }
.
无意义的对象创建,例如 new Integer(text).intValue() or worse new Integer(0).getClass()
if{ if{ if{ if{ if{ if{ if{ if{ ....
当人们创建接口只是为了挂起一组常量时,我讨厌它:
public interface InterfaceAntiPattern { boolean BAD_IDEA = true; int THIS_SUCKS = 1; }
- 接口用于指定行为合同,而不是用于包含常量的便利机制.
与Java无关,但反复调用昂贵的函数而不是存储结果,当你知道它不会改变时.例:
if (expensiveFunction() > aVar) aVar = expensiveFunction(); for (int i=0; i < expensiveFunction(); ++i) System.out.println(expensiveFunction());
最糟糕的Java实践几乎涵盖了所有其他实践:全局可变状态.
荒谬的OO狂热与阶级层次10+级深.
这就是DefaultConcreteMutableAbstractWhizzBangImpl
来自的名字.只是尝试调试那种代码 - 你会在课堂树上上下几个小时.
当您不应该进行子类化时,例如,而不是使用组合,聚合等.
编辑:这是锤子的一个特例.
看到这样的事情:
public static boolean isNull(int value) { Integer integer = new Integer(value); if(integer == null) { return true; } else { return false; } }
他们对多头有类似的方法.
我认为他们最初做过类似的事情
if(value == null) {
并得到一个编译错误,仍然没有意识到原始值不能为空.
我们的实习生使用static
修饰符将当前登录的用户存储在Seam应用程序中.
class Identity{ ... public static User user; ... } class foo{ void bar(){ someEntity.setCreator(Identity.user); } }
当然,当他测试它时它有效:)
我曾经不得不调查一个Web应用程序,其中所有状态都保存在发送给客户端的网页中,而Web服务器中没有状态.
尽管比例很好:)
不关闭finally {}中的数据库连接,文件句柄等
将功能抽象到库类中,永远不会被重复使用,因为它对于要解决的原始问题是如此具体.因此,结束了与没有人会使用,你实际上这完全遮住两个有用的工具一个极大库班也有(即CollectionUtils
和IOUtils
).
......停下来呼吸......
需要调用者执行的API:
Foobar f = new Foobar(foobar_id); f = f.retrieve();
以下任何一项都会更好:
Foobar f = Foobar.retrieve(foobar_id);
要么
Foobar f = new Foobar(foobar_id); // implicit retrieve
要么
Foobar f = new Foobar(); f.retrieve(foobar_id); // but not f = ...
为所有私有变量创建acessors和mutator ,有时不会自动思考.
封装是出于某种原因而发明的.