-
+83
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
public ArrayList<String> bookListByAuthor(String author)
{
ArrayList<String> bookList = null;
for (BookType bType : bookTypes)
{
ArrayList<String> authors = bType.getBookAuthors();
for (String bookAuthor : authors)
{
if (author.equalsIgnoreCase(bookAuthor))
{
if (bookList == null)
{
bookList = new ArrayList<String>(INITIAL_CAPACITY);
}
bookList.add(author);
break;
}
}
}
return bookList == null ? null : bookList;
}
dwinner,
31 Октября 2011
-
+78
- 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();
// ..
}
Оригинальный обход токенов - а вдруг тройка лишних завалялась..
nik_lazer,
27 Октября 2011
-
+78
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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 в старой базе в локальном часовом поясе.
lucidfox,
26 Октября 2011
-
+70
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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 иф-а!
Dimedrol,
25 Октября 2011
-
+83
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
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?
Удивительно, но этот код использовался в вычислениях, связанных с начислением выплат. Разумеется, считалось всё неправильно, в связи с чем было обнаружено ЭТО.
roman-kashitsyn,
25 Октября 2011
-
+75
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
/**
* 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.
Вот теперь приходится расхлёбывать. Наши воркэраунды - самые воркэраундные воркэраунды в мире.
lucidfox,
24 Октября 2011
-
+80
- 1
- 2
- 3
- 4
getBtnContent().setEnabled(enable);
if (getGridConfig().isContentEnabled()) {
getBtnContent().setEnabled(enable);
}
Программист со стажем, всегда хочет быть уверен что кнопка будет доступна на 150%
pvtPyle,
22 Октября 2011
-
+78
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
/*
* Для операций 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);
}
}
}
al_open,
21 Октября 2011
-
+94
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
/**
* 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). Последний раз я сдался и этот
ёжик теперь живет с нами.
enikey,
21 Октября 2011
-
+78
- 1
- 2
- 3
- 4
- 5
- 6
// inside some method
final DateFormat dateFormat = i18n.getDateFormat();
synchronized (dateFormat) {
formatedViolationDate = (violationDate != null) ?
dateFormat.format(violationDate) : "";
}
i18n.getDateFormat() возвращает статический объект DateFormat, который может использоваться несколькими потоками. В руки бы накласть тому, кто это писал.
Решение: getDateFormat() возвращает строку формата, объект формата создаем при каждом вызове.
roman-kashitsyn,
20 Октября 2011