在您的经验中发现的最糟糕的Java实践?

在您的经验中发现的最糟糕的Java实践?,java,Java,类似于 您在Java代码中发现的最糟糕的实践是什么 我的建议是: 在servlet中使用实例变量(实际上,这不仅是错误的做法,而且是错误) 使用HashMap之类的集合实现,而不使用适当的接口 使用看似神秘的类名,如SmsMaker(SmsFactory)或commonvironment(CommunicationContext) 类似线程上的相同答案(适用于所有允许面向对象设计的语言)。与Java没有严格的关系,但反复调用昂贵的函数,而不是存储结果,如果您知道它不会改变的话。例如: if

类似于

您在Java代码中发现的最糟糕的实践是什么

我的建议是:

  • 在servlet中使用实例变量(实际上,这不仅是错误的做法,而且是错误)
  • 使用HashMap之类的集合实现,而不使用适当的接口
  • 使用看似神秘的类名,如SmsMaker(SmsFactory)或commonvironment(CommunicationContext)


类似线程上的相同答案(适用于所有允许面向对象设计的语言)。

与Java没有严格的关系,但反复调用昂贵的函数,而不是存储结果,如果您知道它不会改变的话。例如:

if (expensiveFunction() > aVar)
    aVar = expensiveFunction();
for (int i=0; i < expensiveFunction(); ++i)
    System.out.println(expensiveFunction());
if(expensiveFunction()>aVar)
aVar=expensiveFunction();
对于(int i=0;i
与您的类似,但更进一步:

在Struts操作中正确使用请求作用域变量时使用类(静态)变量:O


这实际上在生产中部署了几个月,直到有一天我检查代码时,才有人注意到任何事情。

我讨厌人们创建界面只是为了挂起一组常量:

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

-接口用于指定行为契约,而不是包含常量的方便机制。

在不需要的情况下进行子类化,例如,不使用组合、聚合等


编辑:这是一个特殊的例子。

将功能抽象到一个库类中,这个库类永远不会被重复使用,因为它非常特定于要解决的原始问题。因此,最终得到了无数个没有人会使用的库类,它们完全掩盖了您实际拥有的两个有用的实用程序(即
CollectionUtils
IOUtils


…暂停呼吸…

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

catch( Exception e ) {}

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

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

 class foo{

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

 }

当然,当他测试它时,它起了作用:)

最糟糕的Java实践,几乎涵盖了所有其他实践:全局可变状态。荒谬的OO狂热,具有10+级的类层次结构


这就是像
DefaultConcreteMutableAbstractWhizzBangImpl
这样的名称的来源。只要试着调试这种代码,你就可以在类树上来回穿梭数小时。

@madlep正是如此!Java社区的某些部分确实过于极端抽象和疯狂深入的类层次结构。几年前,Steve Yegge在博客上发表了一篇关于它的好文章:。

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


但尺度很好:)

六个非常糟糕的例子

  • 而不是错误报告,只是
    系统。在没有警告的情况下退出
    。e、 g.
    if(properties.size()>10000)System.exit(0)深埋在地下
    图书馆
    
  • 使用字符串常量作为 锁。e、 g.
    已同步(“一”){}
  • 锁定可变字段。e、 g.
    synchronized(object){object=…;}
  • 初始化构造函数中的静态字段
  • 触发异常只是为了获取堆栈跟踪。e、 g.
    尝试{Integer i=null;i.intValue();}catch(NullPointerException e){e.printStackTrace();}
  • 无意义的对象创建,例如
    新整数(text).intValue()或更糟的新整数(0).getClass()

我最喜欢的排序算法,由灰胡子旅提供:

List needsToBeSorted = new List ();
...blah blah blah...

Set sorted = new TreeSet ();
for (int i = 0; i < needsToBeSorted; i++)
  sorted.add (needsToBeSorted.get (i));

needsToBeSorted.clear ();
for (Iterator i = sorted.iterator (); i.hasNext ();)
  needsToBeSorted.add (i.next ());
List needsToBeSorted=newlist();
……诸如此类。。。
Set sorted=new TreeSet();
for(int i=0;i

诚然,这是有效的,但最终我说服了他,也许Collections.sort会容易得多。

一旦我遇到“singleton”异常:

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

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

每次都会引发相同的异常实例。。。使用与实际代码流无关的完全相同的stacktrace:-(

一个要求调用方执行以下操作的API:

Foobar f = new Foobar(foobar_id);
f = f.retrieve();
以下任何一项都会更好:

Foobar f = Foobar.retrieve(foobar_id);


不关闭数据库连接、文件句柄等,为所有私有变量创建acessor和mutator,而不停地思考,有时是自动的


发明封装是有原因的。

初级程序员犯的一个错误:不必要地使用成员变量而不是局部变量

Java EE示例:

在servlet或EJB中启动线程(例如启动异步处理任务)

这破坏了Java EE应用程序的可伸缩性。您不应该在Java EE组件中处理线程,因为应用程序服务器应该为您管理线程


我们通过让servlet将消息放在JMS队列上并编写消息驱动bean来处理异步处理任务,从而对其进行重构。

非常注重重用对象,这会导致到处都是静态的东西。 (表示在某些情况下,重复使用可能非常有用)


Java内置了GC,如果需要对象,可以创建一个新对象。

使用异常定义逻辑,其中for循环或任何形式的循环就足够了

例如:

while(i < MAX_VALUE)
{
   try
   {
      while(true)
      {
         array[j] = //some operation on the array;
         j++;  

      }
   }
   catch(Exception e)
   {
      j = 0;
   }
}
while(i

说真的,我认识写这段代码的人。我检查了它并更正了代码:)

几分钟前我看到这行:

Short result = new Short(new Integer(new Double(d).intValue()).shortValue());

我想这张对我来说一定是一张唱片。氯离子
Foobar f = new Foobar();
f.retrieve(foobar_id); // but not f = ...
while(i < MAX_VALUE)
{
   try
   {
      while(true)
      {
         array[j] = //some operation on the array;
         j++;  

      }
   }
   catch(Exception e)
   {
      j = 0;
   }
}
Short result = new Short(new Integer(new Double(d).intValue()).shortValue());
    public DataObjectList (GenerateList (massive signature involving 14 parameters, three of which are collections and one is a collection of collections) 
try { 

250 lines of code to retrieve the data which calls a stored proc that parses some of it and basically contains GUI logic

 } catch (Exception e) {
            return new DataObjectList(e, filterFields);
        }
DataObjectList dataObjectList= EntireSystemObject.getDataObjectList Generator().generateDataObjectList (viewAsUserCode, processedDataRowHandler, folderQuery, pageNumber, listCount, sortColumns, sortDirections, groupField, filters, firstRun, false, false, resetView);

dataObjectList.setData(processedDataRowHandler.getData());

if (dataObjectList.getErrorException() == null) {

do stuff for GUI, I think, put lots of things into maps ... 250 lines or so

       }
            return dataObjectList;
        } else {

put a blank version into the GUI and then  

            throw new DWRErrorException("List failed due to list generation error", "list failed due to list generation error for folder: " + folderID + ", column: " + columnID, List.getErrorException(), ListInfo);
        }
int sval, eval, stepv, i;
double d;
                if (/*someCondition*/)
                    {
                    sval = 360;//(all values multiplied by 20)
                    eval = -271;
                    stepv = -10;
                    }
                else if (/*someCondition*/)
                    {
                    sval = 320;
                    eval = -601;
                    stepv = -10;
                    }
                else if (/*someCondition*/)
                    {
                    sval = 0;
                    eval = -311;
                    stepv = -10;

                    }
                    else
                    {
                    sval = 360;
                    eval = -601;
                    stepv = -10;
                    }
                for (i = sval; i > eval; i = i + stepv)
                    {
                    d = i;
                    d = d / 20.0;
                    //do some more stuff in loop
                    }
try {
   /* open file */
}
catch(Exception e) {
  e.printStackTrace();
}

try {
   /* read file content */
}
catch (Exception e) {
  e.printStackTrace();
}

try {
   /* close the file */
}
catch (Exception e) {
  e.printStackTrace();
}
public static boolean isNull(int value) {
    Integer integer = new Integer(value);

    if(integer == null) {
        return true;
    } else {
        return false;
    }
}
if(value == null) {
boolean negate( boolean shouldNegate, boolean value ) {
  return (shouldNegate?(!value):value;
}
boolean isNotNull( Object o ) {
  return o != null;
}
/**
*
*
*/
/**
* A constructor. Takes no parameters and creates a new instance of MyClass.
*/
public MyClass() {
}