- 1
- 2
- 3
- 4
- 5
- 6
- 7
StringTokenizer st = new StringTokenizer(data[0][14].toString(), ",");
String str = "";
//int numAfPoint = 3;
for (int k = 1; k < st.countTokens() + 3; k++) { //p
str = st.nextToken();
// ..
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+78
StringTokenizer st = new StringTokenizer(data[0][14].toString(), ",");
String str = "";
//int numAfPoint = 3;
for (int k = 1; k < st.countTokens() + 3; k++) { //p
str = st.nextToken();
// ..
}
Оригинальный обход токенов - а вдруг тройка лишних завалялась..
+78
public Date localTimeToUTC(final Date localTime) {
final DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(UTC);
// This is a bit of a trick. Since Java assumes dates are in UTC,
// but localTime is not (blame the weird legacy database...),
// it's a semantically incorrect Date. Therefore we process it as
// if it's in UTC...
final String formatted = format.format(localTime);
format.setTimeZone(localTimeZone);
try {
return format.parse(formatted);
} catch (final ParseException e) {
throw new AssertionError(e); // cannot happen
}
}
И вновь издержки обратной совместимости. Китайские кулибины хранили DateTime в старой базе в локальном часовом поясе.
+70
for (AllResponseCache actionResponse : allResponses) {
if (null != actionResponse.getResponseStatus() && actionResponse.getResponseStatus().length() > 0) {
for (ResponseSubjectCache subj : actionResponse.getSubjects()) {
// find needed element
if (subj.getClaims() != null) {
for (ClaimCache claimCache : subj.getClaims()) {
Seller seller = getSellerByPersonMatched(pool, claimCache);
if (seller != null) {
if (mapToSyncronize.get(seller) == null) {
mapToSyncronize.put((SellerrEntity) seller, new LinkedList<ReportResponseCache>());
}
mapToSyncronize.get(seller).add(actionResponse);
}
}
}
}
}
}
Индусы и "for-if"-ы.
Я уж думал будет хронология как в России с "президентами" - "лысый, волосатый, лысый, волосатый" и так далее.
А тут "for, if, for, if" но в конце всё-таки 2 иф-а!
+83
public static long getDifference(Date date1, Date date2, int unit) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("Date cannot be null!");
}
if (date1.after(date2)) {
Date swap = date1;
date1 = date2;
date2 = swap;
}
long result = 0;
long diff = date2.getTime() - date1.getTime() + (60 * 60 * 1000L);
switch (unit) {
case Calendar.YEAR:
result = diff / (60 * 60 * 24 * 365 * 1000L);
break;
case Calendar.MONTH:
result = diff / (60 * 60 * 24 * 30 * 1000L);
break;
case Calendar.DAY_OF_YEAR:
result = diff / (60 * 60 * 24 * 1000L);
break;
default:
throw new UnsupportedOperationException("Impossible to get time difference in coerced unit.");
}
return result;
}
Опять даты, опять.... Java?
Удивительно, но этот код использовался в вычислениях, связанных с начислением выплат. Разумеется, считалось всё неправильно, в связи с чем было обнаружено ЭТО.
+75
/**
* Workaround ObjectInputStream for maintaining backward compatibility with serialization.
*
* In the future, please, please, PLEASE assign each serializable class an explicit serialVersionUID.
*
*/
public final class DecompressibleInputStream extends ObjectInputStream {
private static final Logger logger = Logger.getLogger(DecompressibleInputStream.class);
public DecompressibleInputStream(InputStream in) throws IOException {
super(in);
}
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();
Class<?> localClass;
try {
localClass = Class.forName(resultClassDescriptor.getName());
} catch (ClassNotFoundException e) {
logger.error("No local class for " + resultClassDescriptor.getName(), e);
return resultClassDescriptor;
}
ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
if (localClassDescriptor != null) { // only if class implements serializable
final long localSUID = localClassDescriptor.getSerialVersionUID();
final long streamSUID = resultClassDescriptor.getSerialVersionUID();
if (streamSUID != localSUID &&
(localClass == ByteArraySerial.class || localClass == Vector2D.class)) {
// Workaround: check for serialVersionUID mismatch with two specific classes
logger.error(String.format("Overriding serialized class version mismatch for %s: " +
"local serialVersionUID = %s, stream serialVersionUID = %s",
localClass.getName(), localSUID, streamSUID));
resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization
}
}
return resultClassDescriptor;
}
}
Продукт использует в качестве бинарного формата сохранённых файлов встроенную сериализацию. При этом ранние версии полагались на встроенный serialVersionUID.
Вот теперь приходится расхлёбывать. Наши воркэраунды - самые воркэраундные воркэраунды в мире.
+80
getBtnContent().setEnabled(enable);
if (getGridConfig().isContentEnabled()) {
getBtnContent().setEnabled(enable);
}
Программист со стажем, всегда хочет быть уверен что кнопка будет доступна на 150%
+78
/*
* Для операций UPDATE идентификаторы объектов должны быть уникальными.
*/
HashMap<Long,Boolean> filterUniqueChangeObjects = new HashMap<Long, Boolean>();
for (RepositoryObject repositoryObject : resultRepositiry) {
if(repositoryObject.getOperationType() == OperationType.UPDATE) {
if(filterUniqueChangeObjects.containsKey(repositoryObject.getObjectId())) {
log.warn("Объект с идентификатором уже присутствует в обработке UPDATE " + repositoryObject.getObjectId());
} else {
resultUniqueRepositiry.add(repositoryObject);
filterUniqueChangeObjects.put(repositoryObject.getObjectId(), true);
}
}
}
+94
/**
* Interface for string cleaners. Defines method that takes a string to perform cleaning and returns
* cleaned string.
*
* @author Король Абстракций.
* @version 1.0 29.04.2011
*
*/
public interface StringCleaner {
//---------------------------------------------------------------------------------------------
/**
* Cleans given string. Returns cleaned string.
* @param string String to clean
* @return Cleaned string
* @throws NullPointerException <code>If string == null</code>
* @since 1.0
*/
public String clean(String string);
//---------------------------------------------------------------------------------------------
}
// Далее реализации.
public abstract class SymbolStringCleaner implements StringCleaner { ... }
public final class AllSymbolStringCleaner extends SymbolStringCleaner { ... }
public final class RepeatedSymbolStringCleaner extends SymbolStringCleaner { ... }
public class TrimStringCleaner extends SymbolStringCleaner { ... }
public final class CombinedStringCleaner implements StringCleaner { ... }
// Пример использования.
public class StringCleanerFactory {
private static final char END_OF_LINE_SYMBOL = '\n';
public static synchronized StringCleaner createCommonStringCleaner() {
char[] symbolsToExclude = new char[] {' ', END_OF_LINE_SYMBOL};
StringCleaner repeatedSymbolsCleaner = new RepeatedSymbolStringCleaner(symbolsToExclude);
StringCleaner trimCleaner = new TrimStringCleaner(symbolsToExclude, true, true);
CombinedStringCleaner resultCleaner = new CombinedStringCleaner();
resultCleaner.add(repeatedSymbolsCleaner);
resultCleaner.add(trimCleaner);
return resultCleaner;
}
}
// В реале выходит что-то вроде
return str.trim().replace(" \n", '');
Очистка строк огнем инквизиции еше никогда не была настолько абстрактной.
P.S.
Я удалял этот StringCleaner API 3 раза, и каждый раз наши адепты стринг клинеров под любым
предлогом поднимали это г***о из анналов ада (svn history). Последний раз я сдался и этот
ёжик теперь живет с нами.
+78
// inside some method
final DateFormat dateFormat = i18n.getDateFormat();
synchronized (dateFormat) {
formatedViolationDate = (violationDate != null) ?
dateFormat.format(violationDate) : "";
}
i18n.getDateFormat() возвращает статический объект DateFormat, который может использоваться несколькими потоками. В руки бы накласть тому, кто это писал.
Решение: getDateFormat() возвращает строку формата, объект формата создаем при каждом вызове.
+82
if (getAgentAgrees() && (firstOrdered || secondOrdered) && !(getDisclaimer().getDisplayed())) {
getDisclaimer().setDisplayed(false);
}
Минут пять вникал в условия, в итоге выяснил, что код только тратит время (моё и процессора).