实例变量和构造函数?

Instance variables and a constructor?

所以我有我的代码:

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 中添加更多方法,例如构造函数和将潜在回文存储到实例变量中的方法,添加这些方法会做什么对于我的程序是否已经正确运行?

我想说的是,对您编写的代码的唯一潜在批评是它实际上不是 面向对象,但仍然使用实例化 class。

面向对象的核心原则是 class 使用的数据和对该数据所做的操作应该捆绑在同一个 "scope" 中,这样这两个事物可以相互看到,但程序中的其他任何东西都无法看到,除非通过 "public" 方法的定义良好的接口。

老实说,如果我写这个程序,palindromeTest() 将是静态的,class 将是最终的,并且它会有一个私有构造函数,将它变成一个库而不是 class(想想像 Math.random() 这样的函数——你调用 random() 而没有实例化一个新的 Math() 对象)。

但是,我从你的问题中推断这是为作业编写的代码。在这种情况下,我建议将 PalindromeTester 的单个实例视为仅测试单个字符串的对象,该字符串被传递到构造函数并存储在私有变量中。此 class 将有一个 public 方法,该方法不带任何参数,并返回该私有变量中的值是否为回文。

目前,您的 PalindromeTester 是一个简单的实用程序 class - 它检查一个字符串是否为回文。所以有人可能会争论是否值得将其放入 class - 你可以在 PalindromeDriver 中使用该方法。

让我们再看一下建议:

有一个构造函数。使用实例变量

public class PalindromeTester {

  private String palindrome;

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

}

鉴于此 class,您可以将实用程序调用 palindromeTest 转换为稍微更具吸引力的形式:

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

然后考虑其他方法,例如

  public String getForwards() { 
    //
  }

  public String getBackwards() {
    //
  }

所有这些都不需要再次传递该字符串。

底线

它会给你买什么?它会使您的程序更多 "Object oriented" 而更少 "functional"。也许更好地阅读。未来更具可扩展性。

我不同意你写了一个非常简单的程序。

可能发生的事情是这个人希望您的程序具有更多 "Object-Oriented" 结构。但是由于您的代码非常简单并且看起来只是在解决一个单一的问题,因此在我看来,在这种情况下没有必要将所有内容都变成对象(即使您可以做到)。

你会得到什么?通过让你的回文测试器class更面向对象,它可以保存你用它执行的动作的状态(即实例变量), 封装内部逻辑,并使跨多个实例方法共享数据变得更容易(这是 OO 中的一般思想)。

不过,这真的只是见仁见智,最重要的一点当然是你的代码能正常工作。