【问题标题】:Instance variables and a constructor?实例变量和构造函数?
【发布时间】:2015-12-03 19:25:34
【问题描述】:

所以我有我的代码:

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

【问题讨论】:

  • 不,你不需要任何东西。但我建议的是,无论何时使用 'if',即使它只有一行语句,也要使用花括号。
  • 另外格式化你的代码最好不要使用一个空格。这样做的另一种方法是 return str.equals(new StringBuffer(str).reverse().toString());
  • 在 if 块之间添加新的行间距也使代码更具可读性,以及适当的制表符间距。

标签: java variables constructor instance palindrome


【解决方案1】:

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

让我们再看一下建议:

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

public class PalindromeTester {

  private String palindrome;

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

}

有了这个类,您就可以将您的实用程序调用 palindromeTest 转换为更吸引人的形式:

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

然后考虑其他方法,例如

  public String getForwards() { 
    //
  }

  public String getBackwards() {
    //
  }

无需再次传入该字符串。

底线

它会给你带来什么?它会让你的程序更“面向对象”,更少“功能”。也许更好读。并且为未来提供更多可扩展性。

【讨论】:

  • 您想到的完全有效的答案,它回答了用户的问题。我会反对投票,除非该人提供了与我刚刚写的相反的有效论点。
  • 谢谢!(对大家)你们都回答了我的问题,我对对象和实用程序类的理解好多了!
  • P.S 我在一堂课上没有所有东西的唯一原因是因为我的教授不允许,他们必须永远是司机
【解决方案2】:

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

面向对象的核心原则是一个类使用的数据和对该数据所做的事情应该捆绑在同一个“范围”中,这样​​这两个东西可以互相看到,但什么也看不到程序中的 else 可以看到,除非通过“公共”方法的定义明确的接口。

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

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

【讨论】:

  • 谢谢!(对大家)你们都回答了我的问题,我对对象和实用程序类的理解好多了!
【解决方案3】:

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

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

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

但同样,这实际上只是一个意见问题,最重要的一点当然是您的代码可以正常工作。

【讨论】:

  • 这里也一样 :-) 无缘无故投反对票很糟糕。
  • 谢谢!(对大家)你们都回答了我的问题,我对对象和实用程序类的理解好多了!
猜你喜欢
  • 2023-03-02
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2015-04-28
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多