当前位置:  开发笔记 > 编程语言 > 正文

您的体验中发现了最糟糕的Java实践?

如何解决《您的体验中发现了最糟糕的Java实践?》经验,为你挑选了16个好方法。

与此问题类似......

您在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;
    }
}

每次抛出相同的异常实例 ...与完全相同的堆栈跟踪,与实际代码流无关:-(



1> asalamon74..:

我必须维护java代码,其中大多数异常处理如下:

catch( Exception e ) {}


不幸的是,我目前的项目做得更糟:`catch(Throwable th){logger.log("出错了"); }`
人们也这样做:catch(例外e){//不会发生} :)
我承认,在使用Oracle的JDBC时,我写了catch(SQLException ex){/*什么可能被抛出?*/}关闭连接时.
嘿,这在C#代码中也很常见.
Java经常要求您捕获永远不会发生的异常.例如,从ByteArrayInputStream读取IOException - 假设您可以控制所述ByteArrayInputStream的创建.
"扔掉"异常的人应该受到惩罚!
这将打开整个"已检查与未经检查的例外"辩论!:)
甚至更糟 - "捕捉(Throwable t){}`

2> Peter Štibra..:

一旦遇到'singleton'异常:

class Singletons {
    public static final MyException myException = new MyException();
}

class Test {
    public void doSomething() throws MyException {
        throw Singletons.myException;
    }
}

每次抛出相同的异常实例 ...与完全相同的堆栈跟踪,与实际代码流无关:-(


最近在我参与的讨论中提出了这个问题.(我做了个鬼脸.):o

3> Peter Lawrey..:

六个非常糟糕的例子;

而不是错误报告,只是 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()


我仍然不知道有10000个属性有什么问题.;)

4> Steve B...:
if{
 if{
  if{
   if{
    if{
     if{
      if{
       if{
         ....


}}}其他{...
在相关的说明中,使用ifs而不是if-elses:if(i == 1){} if(i == 2){}而不是if(i == 1){} else if(i == 2) {}

5> John Topley..:

当人们创建接口只是为了挂起一组常量时,我​​讨厌它:

public interface InterfaceAntiPattern {
  boolean BAD_IDEA = true;
  int THIS_SUCKS = 1;
}

- 接口用于指定行为合同,而不是用于包含常量的便利机制.


静态导入与这一点有什么关系,它们允许你方便地说`if(BAD_IDEA)`而不是`if(ConstantsClassPattern.BAD_IDEA)`,而不必扩展`InterfaceAntiPattern`.
静态导入是在Java 5中引入的,我不知道它们与这一点有什么关系.
Math是一个具体的类而不是接口,因此Math.PI不是这种反模式的一个例子.

6> Claudiu..:

与Java无关,但反复调用昂贵的函数而不是存储结果,当你知道它不会改变时.例:

if (expensiveFunction() > aVar)
    aVar = expensiveFunction();
for (int i=0; i < expensiveFunction(); ++i)
    System.out.println(expensiveFunction());


如何使用该函数返回的值变量更容易?即一行与X行......
您必须完全确定方法的结果不会改变.如果方法发生了变化,因此结果会更频繁地发生变化,然后在编写依赖方法时进行思考,您的代码会在不知道原因的情 如果要缓存,请在被调用的昂贵方法中执行.你知道结果是否在改变.

7> Apocalisp..:

最糟糕的Java实践几乎涵盖了所有其他实践:全局可变状态.


或任何可变状态,如果你可以使用不可变状态

8> madlep..:

荒谬的OO狂热与阶级层次10+级深.

这就是DefaultConcreteMutableAbstractWhizzBangImpl来自的名字.只是尝试调试那种代码 - 你会在课堂树上上下几个小时.



9> volley..:

当您不应该进行子类化时,例如,而不是使用组合,聚合等.

编辑:这是锤子的一个特例.



10> CodeClimber..:

看到这样的事情:

public static boolean isNull(int value) {
    Integer integer = new Integer(value);

    if(integer == null) {
        return true;
    } else {
        return false;
    }
}

他们对多头有类似的方法.

我认为他们最初做过类似的事情

if(value == null) {

并得到一个编译错误,仍然没有意识到原始值不能为空.


我现在非常惭愧,但是当我开始编程时,我做了一个像这样的方法:`public boolean isNull(){return this == null}`

11> jb...:

我们的实习生使用static修饰符将当前登录的用户存储在Seam应用程序中.

 class Identity{
    ...
    public static User user; 
    ...
 }

 class foo{

    void bar(){
       someEntity.setCreator(Identity.user); 
    }

 }

当然,当他测试它时它有效:)


我做到了!我唯一的拯救恩典是我是一名学生,虽然评估我工作的人没有抓住我的错误,但我确实在下一个项目中找到了答案.
实习生在那里学习,所以我想这是可以原谅的.希望他不会再这样做了!

12> Thorbjørn Ra..:

我曾经不得不调查一个Web应用程序,其中所有状态都保存在发送给客户端的网页中,而Web服务器中没有状态.

尽管比例很好:)


嘿,这是RESTful!
对于奖励积分,还要将*用户凭证*发送到浏览器.

13> dogbane..:

不关闭finally {}中的数据库连接,文件句柄等



14> oxbow_lakes..:

将功能抽象到库类中,永远不会被重复使用,因为它对于要解决的原始问题是如此具体.因此,结束了与没有人会使用,你实际上这完全遮住两个有用的工具一个极大库班有(即CollectionUtilsIOUtils).

......停下来呼吸......



15> slim..:

需要调用者执行的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 = ...



16> Emilio M Bum..:

所有私有变量创建acessors和mutator ,有时不会自动思考.

封装是出于某种原因而发明的.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有