实例变量和构造函数?

时间:2015-12-03 19:25:35

标签: java variables constructor instance palindrome

所以我有我的代码:

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

3 个答案:

答案 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中的一般想法)。

但同样,这只是一个意见问题,当然,最重要的一点是你的代码正常运作。