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