2015-12-03 4 views
0

Так у меня есть код:.Переменные экземпляра и конструктор?

import java.util.Scanner; 

public class PalindromeDriver 
{ 
    public static void main(String[] args) 
    { 
    String another = "y"; 
    Scanner scan = new Scanner(System.in); 
    PalindromeTester section = new PalindromeTester(); 
    while (another.equalsIgnoreCase("y")) 
    { 
    System.out.println("Enter a palindrome:"); 
    String str = scan.nextLine(); 
    if (section.palindromeTest(str)) 
    System.out.println(str + " IS a palindrome!"); 
    else 
    System.out.println(str + " is NOT a palindrome!"); 
    System.out.println("Test another?(y/n)"); 
    another = scan.nextLine(); 
    } 
} 
} 

и ... импорт java.util *;

public class PalindromeTester 
{ 
public boolean palindromeTest(String str) 
{ 
if (str.length() <= 1) 
    return true; 
if (str.charAt(0) == str.charAt(str.length() - 1)) 
    return palindromeTest(str.substring(1, str.length() - 1)); 
    return false; 
} 
} 

мне сказали, что мой код хорошо, но я должен иметь еще несколько методов, добавленных в PalindromeTester, такие как конструктор и метод, который будет хранить потенциальный палиндром в переменный экземпляре, что бы добавлением этого методы делают для моей программы, если она уже работает правильно?

+1

Вам ничего не нужно. Но я рекомендую, всякий раз, когда вы используете «if», даже если он имеет один оператор строки, используйте фигурные скобки. –

+0

Также форматируйте код лучше не используйте одно пространство. Другим способом сделать это будет return str.equals (новый StringBuffer (str) .reverse(). ToString()); – StackFlowed

+0

Добавление новых пространственных пространств между вашими блоками if также делает код более читаемым, а также правильное расстояние между вкладками. – ryuu9187

ответ

2

На данный момент ваш PalindromeTester является простым классом Utility - он проверяет одну строку как палиндром или нет. Поэтому можно утверждать, стоит ли даже ставить это в класс - вы можете использовать этот метод в PalindromeDriver над всеми.

Давайте на второй взгляд на предложения:

есть конструктор. Используйте экземпляр переменной

public class PalindromeTester { 

    private String palindrome; 

    public PalindromeTester(String candidate) { 
    palindrome = candidate; 
    } 

} 

Учитывая этот класс, можно затем преобразовать утилиту вызова palindromeTest в несколько более привлекательную форму:

public boolean isPalindrome() { 
    //Do check here 
    } 

А потом думать о дополнительных методах, как

public String getForwards() { 
    // 
    } 

    public String getBackwards() { 
    // 
    } 

Все без необходимости передавать эту строку еще раз.

Bottomline

Что бы купить вам? Это сделает вашу программу более «объектно-ориентированной» и менее «функциональной». И лучше читать, может быть. И еще более расширяемый для будущего.

+0

Downvoter, порекомендовать? – Jan

+0

Совершенно правильный ответ, о котором вы думали, и он отвечает на вопрос пользователя. Я буду противостоять голосованию, если только человек не предоставит действительный аргумент, противоречащий тому, что я только что написал. – ryuu9187

+0

Спасибо всем (всем), вы все ответили на мой вопрос, и мое понимание предметных и служебных классов намного лучше! –

1

Я бы сказал, что единственная потенциальная критика вашего кода как написанная заключается в том, что на самом деле это не объектно-ориентированный, но по-прежнему использует instanced-класс.

Основным принципом ориентации объектов является идея о том, что данные, используемые классом, и материал, который делается для этих данных, должны быть объединены в один и тот же «объем», чтобы эти две вещи могли видеть друг друга, но ничто другое в программе не может увидеть, кроме как через четко определенный интерфейс «общедоступных» методов.

Честно говоря, я пишу эту программу, palindromeTest() будет статичным, класс будет окончательным, и у него будет собственный конструктор, превратив его в библиотеку, а не в класс (подумайте о таких функциях, как Math.random() - вы вызываете random(), не создавая новый объект Math().

Однако, я выхожу из вашего вопроса, что это код, написанный для задания. В этом случае я бы рекомендовал рассмотреть один экземпляр PalindromeTester как объекта, который проверяет только одну строку, которая передается конструктору и хранится в частной переменной. У этого класса был бы единственный открытый метод, который не принимал бы никаких аргументов и возвращал, было ли значение в этой частной переменной палиндром.

+0

Спасибо всем (всем), вы все ответили на мой вопрос, и мое понимание предметных и служебных классов намного лучше! –

1

Я не согласен с тем, что у вас очень простая программа.

Возможно, что происходит, что человек хочет, чтобы у вас была более объектно-ориентированная структура вашей программы. Но так как ваш код довольно прост и выглядит просто решением единственной проблемы, в этом случае не нужно делать все в объектах (хотя вы можете это сделать).

Что бы вы приобрели? Если вы сделаете свой класс тестера палиндрома более объектно-ориентированным, он может сохранить состояние действий, которые вы выполняете с ним (например, переменные экземпляра), инкапсулировать внутреннюю логику и упростить обмен данными между несколькими методами экземпляра (как и общая идея в ОО).

Но опять-таки, это действительно вопрос мнения, и самым важным является, конечно, то, что ваш код работает правильно.

+0

То же самое здесь :-) Downvoting без причины сосет. – Jan

+1

Спасибо всем (всем), вы все ответили на мой вопрос, и мое понимание предметных и служебных классов намного лучше! –

Смежные вопросы