工具类不应该有公有的构造函数

工具类不应该有公有的构造函数

工具类是一系列静态成员或方法的集合,意味着它不可以被实例化,即使是抽象的工具类,它可以被继承,但也不可以有公有的构造函数。

Java类如果没有声明构造函数,则会默认有一个公有的构造函数,因此需要给工具类至少声明一个非公有的构造函数。

不符合要求的代码示例

class StringUtils { // Noncompliant

  public static String concatenate(String s1, String s2) {
      return s1 + s2;
  }

}

解决方案

class StringUtils { // Compliant

  private StringUtils() {
  }

  public static String concatenate(String s1, String s2) {
      return s1 + s2;
  }

}

原文地址:Utility classes should not have public constructors

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
有关类与对象的程序算法设计:1.试分析以下程序的运行结果并上机验证. #include<iostream.h> class Sample {    int x; public:    Sample(){}    Sample(int a){x=a;}    Sample(Sample &a){x=a.x+++10;}    void disp(char *ob)    { cout<<ob<<"x="<<endl;}    };    void main()    {     Sample s1(2),s2(s1),s3;     s3=s2;     s1.disp("s1.");     s2.disp("s2.");     s3.disp("s3.");    }    运行结果为:                                                          2.以下是一个类中包含另一个类对象成员(类的组合)的例子,试分析并给出程序的运行结果. #include<iostream.h> class Son {  int age; public: Son(){ age=1;} Son(int i){age=i;} void print(){ cout<<"儿子的年龄是:"<<age<<endl;} }; class Father {   int age;   Son s1,s2; public:    Father(int a1,int a2,int f):s2(a2),s1(a1)    { age=f;}    void print()    {    cout<<"父亲的年龄是:"<<age<<endl; }    Son&gets1(){cout<<"第一个";return s1;}    Son&gets2(){cout<<"第二个";return s2;}    };    Void main()    {    Father f(10,5,38);    f.print();    f.gets1().print();    f.gets2().print();     }    运行结果为:                                                      3.定义一个类score,它含有私有数据成员english_score(英语分数)、公有成员函数printscore(),其中printscore()用来输出english_score的值。在主程序中定义类score的两个对象stu1和stu2,其英语成绩分别为85.5和98.5,输出这两个分数。用构造函数来初始化私有成员。 【实验步骤】 第3题的实验步骤如下: 根据题目要首先定义一个score类。 使用debug调试功能观察以下参考程序的运行流程,跟踪观察类的构造类的构造函数析构函数、成员函数的执行顺序。 #include<iostream.h>   class score{   float english_score;   public:   score(float t){english_score=t;} void printscore(){cout<<”english_score=”<<english_score;}    }; void main() { score stu1(85.5),stu2(98.5);    stu1.printscore();    stu2.printscore();} 调试操作步骤如下: 单击Build|Start Debug|Step Into命令,或按下快捷键F11,系统进入单步执行状态,程序开始运行,一个DOS窗口出现,此时Visual Studio中光标停在main()函数的入口处; 从Debug菜单或Debug工具栏中单击Step Over,此时,光标下移,程序准备执行score对象的初始化; 单击Step Into,程序准备执行score类的构造函数; 连续单击Step Over,观察构造函数的执行情况,直到执行完构造函数,程序回到主函数; 此时程序准备执行stu1对象的printscore()函数,单击Step Into,程序进入printscore()成员函数,连续单击Step Over,直到回到main()函数; 连续执行程序,参照上述方法,观察程序的执行顺序,加深对类的构造函数、析构函数、成员函数的执行顺序的认识; 在试试Debug菜单栏中别的菜单中别的菜单项,熟悉Debug各种方法。 【实验仪器与软件平台】 计算机 Windows2000 Visual C++6.0 【实验预备知识】 计算机文化基础 【实验结果】 1.程序: #include<iostream.h> class Sample { int x; public: Sample(){} Sample(int a){x=a;} Sample(Sample &a){x=a.x+++10;} void disp(char *ob) { cout<<ob<<"x="<<endl;} }; void main() { Sample s1(2),s2(s1),s3; s3=s2; s1.disp("s1."); s2.disp("s2."); s3.disp("s3."); } 运行结果: } 2.程序: #include<iostream.h> class Son { int age; public: Son(){ age=1;} Son(int i){age=i;} void print(){ cout<<"儿子的年龄是:"<<age<<endl;} }; class Father { int age; Son s1,s2; public: Father(int a1,int a2,int f):s2(a2),s1(a1) { age=f;} void print() { cout<<"父亲的年龄是:"<<age<<endl; } Son&gets1(){cout<<"第一个";return s1;} Son&gets2(){cout<<"第二个";return s2;} }; void main() { Father f(10,5,38); f.print(); f.gets1().print(); f.gets2().print(); } 运行结果: 程序: #include<iostream.h> class score{ float english_score; public: score(float t){english_score=t;} void printscore(){cout<<"english_score="<<english_score;} }; void main() { score stu1(85.5),stu2(98.5); stu1.printscore(); stu2.printscore();} 运行结果: 【实验总结】通过本次实验基本掌握类的声明方法,掌握类成员函数的定义形式. 深刻理解对象的概念,掌握对象的定义和使用方法,学会了构造函数和析构函数的作用及其使用方法以及类的组合.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值