所以我有我的代码:
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();
}
}
}
和... import 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中添加更多方法,例如构造函数和将潜在的回文存储到实例变量中的方法,添加这些方法会为我做什么程序,如果它已经正确运行?
答案 0 :(得分:2)
目前,您的PalindromeTester是一个简单的Utility类 - 它会检查一个字符串是否为回文。所以有人可能会争论是否值得将它放入一个类中 - 你可以在PalindromeDriver中使用该方法。
让我们再看看这些建议:
有一个构造函数。使用实例变量
public class PalindromeTester {
private String palindrome;
public PalindromeTester(String candidate) {
palindrome = candidate;
}
}
鉴于此课程,您可以将实用程序调用{{1}}转换为更具吸引力的形式:
palindromeTest
然后考虑其他方法,如
public boolean isPalindrome() {
//Do check here
}
所有这些都不需要再次传递该字符串。
<强>底线强>
它会给你带来什么?它会使你的程序更“面向对象”而不是“功能”。也许更好地阅读。对未来更具有可扩展性。
答案 1 :(得分:1)
我会说,对你的代码写的唯一可能的批评是它实际上不是面向对象的,但仍然使用实例类。
面向对象的核心原则是这样一种观点,即一个类使用的数据和对这些数据所做的东西应该在同一个“范围”中捆绑在一起,这样这两个东西就能看到对方,但没有除了通过明确定义的“公共”方法接口之外,程序中的其他任何一个都可以看到。
老实说,如果我编写这个程序,palindromeTest()将是静态的,类将是final,并且它将有一个私有构造函数,将其转换为库而不是类(考虑像Math.random这样的函数) ) - 在没有实例化新的Math()对象的情况下调用random()。
但是,我从你的问题推断这是为作业编写的代码。在这种情况下,我建议将PalindromeTester的单个实例视为仅测试单个字符串的对象,该字符串将传递给构造函数并存储在私有变量中。这个类有一个不带参数的公共方法,并返回该私有变量中的值是否为回文。
答案 2 :(得分:1)
我不同意你编写了一个非常简单的程序。
可能正在发生的事情是,这个人希望你有一个更多的&#34;面向对象的&#34;结构到你的程序。但是因为你的代码非常简单并且只是想解决一个单一的问题,所以在我看来,将所有内容都变成对象是不必要的(即使你可以这样做)。
你会获得什么?通过使你的palindrome测试器类更加面向对象,它可以保存你用它执行的动作的状态(即实例变量),封装内部逻辑,并使它成为可能更容易跨多个实例方法共享数据(这是OO中的一般想法)。
但同样,这只是一个意见问题,当然,最重要的一点是你的代码正常运作。