проблема дизайна в определении класса Java - PullRequest
0 голосов
/ 29 февраля 2012

Что касается следующей Java-программы для проверки палиндрома, я не понимаю, почему она должна включать private String pal; в определение этого класса.Это проблема дизайна, вызовет ли она проблему при удалении этой строки кода?

public class Palindrome {
    private String pal;

    public Palindrome(String initPal) {
        pal = initPal.toUpperCase();
    }

    public boolean isPalindrome() {
        if (pal.length() <= 1) {    
            return true;        
        }
        char first = pal.charAt(0);
        char last = pal.charAt(pal.length()-1); 

        if (Character.isLetter(first) && Character.isLetter(last)) {      
            if (first != last) {        
                return false;           
            }
            else {      
            Palindrome sub = new Palindrome(pal.substring(1,pal.length()-1));
            return sub.isPalindrome();  
            }
        }
        else if (!Character.isLetter(first)) {

            Palindrome sub = new Palindrome(pal.substring(1));
            return sub.isPalindrome();     
        }
        else {

            Palindrome sub = new Palindrome(pal.substring(0,pal.length()-1));
            return sub.isPalindrome();      
        }
    }

    public static void main(String[] args) {
        Palindrome p1 = new Palindrome("abcdcba.");
        System.out.println(p1.isPalindrome());
    }
}

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Из того, что я вижу, все, что делает ваш класс Палиндром, проверяет, является ли строка палиндромом. Очевидно, вам не нужен частный приятель String для такого класса.

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

 public static boolean isPalindrome(String string) 
    {
       // your logic here.
    }

Затем вы можете вызвать этот метод следующим образом -

 String string = "aabaa";
 boolean isPalindrome = Palindrome.isPalindrome(string);

Нет абсолютно никакой необходимости иметь переменную экземпляра, такую ​​как pal, если весь ваш класс проверяет, является ли строка палиндромом.

0 голосов
/ 29 февраля 2012

Он должен включать это приватное поле, чтобы он мог хранить параметр конструктора достаточно долго, чтобы его можно было использовать, когда кто-то вызывает метод isPalindrome.

Просто посмотрите на все места, которые pal используются: все они находятся в области действия экземпляра класса, но находятся вне области действия конструктора. Если поле не было объявлено, isPalindrome не сможет получить доступ к этим данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...