【问题标题】:a design issue on a java class definitionjava类定义的设计问题
【发布时间】:2012-02-28 22:09:20
【问题描述】:

关于以下用于检查回文的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());
    }
}

【问题讨论】:

  • 好吧,你的类需要一些字符串属性,所以调用者设置要分析的字符串,然后让它检查它是否是回文,对吧?适当的缩进有助于可视化类的内容
  • 如果你删除它会发生什么:-) 试试吧

标签: java class constructor


【解决方案1】:

它必须包含该私有字段,以便它可以存储足够长的构造函数参数,以便在有人调用 isPalindrome 方法时使用。

只要看看pal 被使用的所有地方:这些都在类实例的范围内,但在构造函数的范围之外。如果未声明该字段,isPalindrome 将无法访问此数据。

【讨论】:

    【解决方案2】:

    据我所知,您的 Palindrome 类所做的只是检查字符串是否为回文。显然,这样的课程不需要私有 String 朋友。

    事实上,你应该让这个类成为一个实用类,而不是有一个像这样的静态方法-

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

    然后你可以像这样调用这个方法 -

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

    如果你的类所做的只是检查字符串是否是回文,那么绝对不需要像 pal 这样的实例变量。

    【讨论】:

    • 最后,如果没有属性,这不应该成为其他地方的方法吗?我的意思是,那个类不会是某种东西的抽象,不会注入依赖项等等......
    • 是的,它可以放在实用程序类中。
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多