Ответы пользователя по тегу Java
  • Какую базу данных лучше всего использовать для обучения новичка?

    @bedward70
    H2 database
    1. Написана на java и легко интегрируется как внешняя, или Embedded, или Memory БД;
    2. Поддерживает много диалектов;
    3. Удобство создания;
    4. Удобство архивирования (достаточно архивнуть каталог, где расположена БД);
    5. Удобство переносимости можно перенести каталог.

    Из минусов: если вы меняете версию библиотеки H2 Database - будьте готовы пересоздать базы.
    Ответ написан
    Комментировать
  • Как сделать Expected Exeption в Unit тесте положительным результатом?

    @bedward70
    santaatnas в комментариях правильно написал: "что вам мешает выполнить этот кусок кода в try блоке, и в catch блоке поймать необходимый exception и сделать assertEquals по имени класса объекта?"

    От себя добавлю, что есть замечательный метод
    fail();
    Его используйте для участков кода, которые не должны выполниться в тесте.

    Ниже пример для тестирования гарантированного эксепшена:
    import org.junit.Test;
    
    import static junit.framework.TestCase.assertEquals;
    import static junit.framework.TestCase.fail;
    
    public class ExampleTest {
    
        private void exceptionMethod() throws Exception {
            throw new RuntimeException("test");
        }
    
        @Test
        public void test() {
            try {
                exceptionMethod();
                fail("Impossible");
            } catch (Exception e) {
                assertEquals("Checks class", RuntimeException.class, e.getClass());
                assertEquals("Checks message", "test", e.getMessage());
            }
        }
    }
    Ответ написан
    2 комментария
  • Когда в коде следует использовать интерфейсы (Java)?

    @bedward70
    DevMan прав - по парадигме всегда!
    На практике - любой написанный код (класс или интерфейс) требует расходов времени на создание и сопровождение. Сопровождать примитивный класс проще, чем примитивный класс и его интерфейс.

    Поэтому на практике, обычно, пишут интерфейсы:
    1. Как необходимую часть паттернов;
    2. Если "интерфейс - это контракт взаимодействия": разрабатывается библиотека или компонент, здесь интерфейсы - это часть неизменяемого контракта;
    3. Хорошая практика - все сервисы делать с интерфейсами. К этому подталкивают многие фреймерки JAVA, как пример: Spring и OSGi (Apache Felix);
    4. Для JUnit тестировая. Пример: при тестировании бизнес логики, реальные сервисы заменяются тестовыми заглушками. Соотвественно класссы бизнес логики должны использовать интерфейсы, которые при реальной работе земеняются реальными имплементациями, а в тестовом окружении - тестовыми заглушками.
    Ответ написан
    Комментировать
  • Как сделать реверс строки с сохранением позиции отдельных символов?

    @bedward70
    Добрый день!
    У вас ошибка, должно получится а1амм алым уам5р.
    Наверное надо делать в ручную реверс слов с условием.
    Примерно вот так (JAVA 1.8, PREDICATE - разрешает переставлять символы):
    import java.util.StringJoiner;
    import java.util.function.Function;
    
    public class AppSwap {
    
        public static final String WORD_DELIMITER = " ";
        public static final Function<Character, Boolean> PREDICATE = character
            -> character < '0' || character > '9';
    
        public static void main(String[] args) throws Exception {
    
            final String originalSequence = "м1ама мыла рам5у";
            final String transformedSequence = transform(originalSequence);
            System.out.println(originalSequence);
            System.out.println(transformedSequence);
        }
    
        private static String transform(String originalSequence) {
    
            // Split делим на слова
            final String[] words = originalSequence.split(WORD_DELIMITER);
    
            // Transform преобразуем
            for (int i = 0; i < words.length; i++) {
                words[i] = transformWord(words[i], PREDICATE);
            }
    
            // Join объединяем в предложение
            final StringJoiner stringJoiner = new StringJoiner(WORD_DELIMITER);
            for (int i = 0; i < words.length; i++) {
                stringJoiner.add(words[i]);
            }
            return stringJoiner.toString();
        }
    
        private static String transformWord(final String inputWord, final Function<Character, Boolean> predicate) {
    
            final char[] chars = inputWord.toCharArray();
            for (int i = 0; i < chars.length / 2; i++) {
    
                final int startIndex = i;
                final int lastIndex = chars.length - 1 - i;
                if (
                    predicate.apply(chars[startIndex])
                    && predicate.apply(chars[lastIndex])
                ) {
    
                    // Swap \ Обмен символами
                    swapChars(chars, startIndex, lastIndex);
                }
            }
            return new String(chars);
        }
    
        private static void swapChars(final char[] chars, final int startIndex, final int lastIndex) {
            final char temp = chars[startIndex];
            chars[startIndex] = chars[lastIndex];
            chars[lastIndex] = temp;
        }
    }
    Ответ написан
    Комментировать
  • Деление в столбик java?

    @bedward70
    Хорошая задачка. Вот что получилось:
    public class AppDivide {
        public static void main(String[] args) throws Exception {
    
            /** Делимое */
            int dividend = 554223;
            /** Делитель */
            int divider = 11;
    
            divide(dividend, divider);
        }
    
        private static void divide(int dividend, int divider) throws Exception {
            validate(dividend);
            validate(divider);
    
            // Находим мин длину для отображения (+1 - это для знака минус)
            int maxLen = 1 + Math.max(Integer.valueOf(dividend).toString().length(), Integer.valueOf(divider).toString().length());
            String intFormat = "%" + maxLen + "d";
            System.out.println(generateTab(maxLen + maxLen + 2, '='));
            System.out.println(" " + String.format(intFormat, dividend) + "|" + String.format(intFormat, divider));
    
            int result = 0;
            while (true) {
    
                // Найти следующую цифру
                Num num = divideNext(dividend, divider);
                if (num.getDigit() == 0) {
                    break;
                }
    
                // Вывод вычитаемого значения и полученной цифры
                String numFormat = "%" + (maxLen - num.getPointPosition()) + "d";
                System.out.println(" " + String.format(numFormat, -divider * num.getDigit()) + generateTab(num.getPointPosition(), ' ') + "|" + String.format(numFormat, num.getDigit()));
    
                // Модифицирование остатка и сохранение в результат
                result += num.getValue();
                dividend -= num.getValue() * divider;
    
                // Вывод линии и остатка
                System.out.println(generateTab(maxLen + maxLen + 2, '-'));
                System.out.println(" " + String.format(intFormat, dividend) + "|" );
    
            }
    
            // Вывод остатка и результата
            System.out.println(generateTab(maxLen + maxLen + 2, '='));
            System.out.println(" " + String.format(intFormat, dividend) + "|" + String.format(intFormat, result));
        }
    
        private static Num divideNext(int dividend, int divider) {
            int pointPosition = 0;
            if (dividend < divider) {
                return new Num(0,0);
            }
            while(dividend > divider * 10) {
                pointPosition ++;
                divider *= 10;
            }
            int count = 1;
            while(dividend > divider * (count + 1)) {
                count ++;
            }
            return new Num(count, pointPosition);
        }
    
        private static String generateTab(int length, char ch) {
            StringBuilder result = new StringBuilder();
            for (int i = 0 ; i < length; i++) {
                result.append(ch);
            }
            return result.toString();
        }
    
        private static void validate(int value) throws Exception {
            if (value < 0) {
                throw new Exception("Validation error: " + value);
            }
        }
    
         private static class Num {
    
             private final int digit;
             private final int pointPosition;
    
             public Num(int value, int pointPosition) {
                 this.digit = value;
                 this.pointPosition = pointPosition;
             }
    
             public int getDigit() {
                 return digit;
             }
    
             public int getPointPosition() {
                 return pointPosition;
             }
    
             public int getValue() {
                 int result = digit;
                 for (int i = 0; i < pointPosition; i++) {
                     result *= 10;
                 }
                 return result;
             }
         };
    }


    Вот как выглядит результат:
    ================
      554223|     11
     -55    |  5
    ----------------
        4223|
       -33  |    3
    ----------------
         923|
        -88 |     8
    ----------------
          43|
         -33|      3
    ----------------
          10|
    ================
          10|  50383
    Ответ написан
    Комментировать
  • Относятся ли Апплеты и Java Web Start к Java Core?

    @bedward70
    1. Формально Апплеты и JWS - это J2SE, таким образом можно отнести к Java Core.
    2. На практике, практически не используется из-за неудобств, которые нужно решать с безопасностью:
    а) апплеты должны быть подписаны зарегистрированным сертификатом и, насколько знаю, необходимо каждые полгода обновлять сертификат. Если подписываешь не зарегистрированным - приходится кучу разрешений в браузерах проставлять.
    б) JWS - клиент должен вам доверять, чтоб запускать что-то скаченное по сети.
    Так что, если junior этого не знает - ничего страшного.
    Ответ написан
    Комментировать
  • Где не стоит исопльзовать MVC?

    @bedward70
    Если вы пишите в процедурном стиле, то почему бы и нет - используйте MVC.
    Если в ООП - то стоит задуматся.
    Предлагаю ознакомится со статьей Егора Бугаенко, чтобы выработать разобратся с этим вопросом: MVC vs. OOP .
    Ответ написан
    Комментировать
  • Создания сайт на Java, с чего начать?

    @bedward70
    Добрый день!
    Для написания софта для промышленных заказчиков (где красывые картинки - это не главное), обычно выбирают Spring: быстро, надежно, не JAVAEE.

    Для написания своего WEB, рекомендую Serving Web Content with Spring MVC. Можно скачать инициализационный проект и самаму его довести до ума или уже финальный.

    На этом же сайте Spring Guides найдете примеры с БД, REST и другими технологиями по Spring.
    Ответ написан
    Комментировать
  • Java. Как равномерно распределить пробелы, чтобы строка стала заданной длины?

    @bedward70
    Добрый день, всем!
    Понравилась задачка, написал:
    package ru.bedward70.toster.q440809;
    
    public class App {
    
    	public static void main(String[] args) {
    		final String origin = "Мама мыла раму!";
    		final String result = addSpaces(origin, 20);
    		System.out.println("        12345678901234567890123456789012345678901234567890");
    		System.out.println("Origin: " + origin);
    		System.out.println("Result: " + result);
    	}
    
    	private static final String DELIMITER = " "; 
    	
    	private static String addSpaces(String origin, int count) {
    		
    		// Validation | проверка от зацикливания
    		if (origin.indexOf(DELIMITER) == -1) {
    			throw new RuntimeException("No \"" + DELIMITER + "\" in \"" + origin + "\" string");
    		}
    
    		// work Buffer | Рабочий буфер
    		final StringBuilder sb =  new StringBuilder(origin);
    		
    		// Delimiter Point | Указатель, где происходит поиск делимитера  
    		int point = 0; 
    		
    		// Cycle | Пока не набьем нужную длину
    	    while (sb.length() < count) {
    	    	int index = sb.indexOf(DELIMITER, point);
    	    	
    	    	// end text | Если конец текста, то начинаем с начала
    	    	if (index == -1) {
    	    		point = 0;
    	    		continue;
    	    	}
    	    	
    	    	// is next the delimiter? | Если не последний делимитер в последовательности делимитеров, то это не наш случай - пропускаем    
    	    	point = index + DELIMITER.length();
    	    	if (point == sb.indexOf(DELIMITER, point)) {
    	    		continue;
    	    	}
    	    	
    	    	// Add delimiter | Нашли последний делимитер в последовательности делимитеров, то добавляем 
    	    	sb.replace(point, point, DELIMITER);
    	    	point += DELIMITER.length();
    	    }
    		return sb.toString();
    	}
    }
    Ответ написан
    Комментировать
  • Как подключиться к серверу с помощью Java?

    @bedward70
    Добрый день!
    Я бы порекомендовал библиотеки для JAVA:
    1. Если использовать FTP - Apache Net
    2. Если использовать SFTP - JCraft JSch
    Ответ написан
    Комментировать