Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中正确使用final参数 在C++中,我知道,在这些变量中添加 const 参数是很好的做法,这些方法返回值,例如: bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{} 我的问题是:在C++中使用最终< /C> java是一个很好的实践,就像C++中的代码> const < /C> >,并声明特定的方法和/或变量最终< /C> >(如对于构造函数传递的值(公共内容(最后字符串HAHA)< /代码>)?_Java_C++_Final - Fatal编程技术网

在Java中正确使用final参数 在C++中,我知道,在这些变量中添加 const 参数是很好的做法,这些方法返回值,例如: bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{} 我的问题是:在C++中使用最终< /C> java是一个很好的实践,就像C++中的代码> const < /C> >,并声明特定的方法和/或变量最终< /C> >(如对于构造函数传递的值(公共内容(最后字符串HAHA)< /代码>)?

在Java中正确使用final参数 在C++中,我知道,在这些变量中添加 const 参数是很好的做法,这些方法返回值,例如: bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{} 我的问题是:在C++中使用最终< /C> java是一个很好的实践,就像C++中的代码> const < /C> >,并声明特定的方法和/或变量最终< /C> >(如对于构造函数传递的值(公共内容(最后字符串HAHA)< /代码>)?,java,c++,final,Java,C++,Final,当在方法和方法参数上使用时,final关键字具有不同的含义 在方法上时,这意味着无法重写此方法 启用方法参数时,表示该方法不能 在其主体中更改此参数的值 编辑: 在某些情况下,编译器强制您将它们声明为final。下面是一个这样的示例(这是一些典型的DAO代码)。因此,人们通常只在编译器强制他们这样做时才这样做 public List<Process> getProcesses(final Integer uid, final String status) { return

当在方法和方法参数上使用时,
final
关键字具有不同的含义

  • 在方法上时,这意味着无法重写此方法
  • 启用方法参数时,表示该方法不能
    在其主体中更改此参数的值
编辑:

在某些情况下,编译器强制您将它们声明为final。下面是一个这样的示例(这是一些典型的DAO代码)。因此,人们通常只在编译器强制他们这样做时才这样做

public List<Process> getProcesses(final Integer uid, final String status) {
    return getHibernateTemplate().executeFind(new HibernateCallback() {
        public Object doInHibernate(Session session) 
                throws HibernateException, SQLException 
        {
            StringBuilder sbQuery = new StringBuilder
            ("select * from [process] where [uid] = :u and [status] = :s");

            SQLQuery query = session.createSQLQuery(sbQuery.toString());

            query.addEntity(Process.class);

            query.setParameter("u", uid);
            query.setParameter("s", status);

            List l = query.list();
            return (List<Process>)l;
        }
    });
}
public List getprocesss(最终整数uid,最终字符串状态){
返回getHibernateTemplate().executeFind(新的HibernateCallback()){
公共对象doInHibernate(会话)
抛出HibernateeException、SQLException
{
StringBuilder sbQuery=新建StringBuilder
(“从[process]中选择*,其中[uid]=:u和[status]=:s”);
SQLQuery=session.createSQLQuery(sbQuery.toString());
查询.加法(进程.类);
setParameter(“u”,uid);
query.setParameter(“s”,状态);
List l=query.List();
返回(列表)l;
}
});
}

请注意,在Java中声明参数
final
是一个实现细节,而C/C++中的
const
参数会更改方法签名!
final
只意味着变量不会更改。变量引用的任何对象都可以更改。因此,
final
对于me的调用方来说没有任何意义方法。与此相反,
const
参数定义了与调用方的约定:该方法承诺不会更改通过该参数提交的任何数据。使用java,您无法创建这样的约定,因此必须退回到不可变对象或防御副本

回到你的问题上来:因为
final
是一个实现细节,所以在考虑接口时它并不重要。这是一个品味的问题。有些人,特别是那些来自函数式语言的人喜欢
final
,因为他们声明变量只有在实际发生某些变化时才应该是可变的其他人只是不喜欢添加的关键字,这会增加视觉噪音


通常,这个决定是在项目级别做出的:要么在项目中的任何地方使用
final
,要么在任何地方都不使用。项目中的每个开发人员都应该做同样的事情,否则代码看起来会不一致。

是的。Eclipse IDE具有代码清理设置,可以自动为您执行此操作,尽管我只在方法中使用它参数。

在java中使用
final
关键字时应小心

1.将
final
关键字应用于无法将值重新分配给变量的变量

2.如果某个方法被降级为
final
,则无法覆盖该方法

3.如果类声明为不能扩展的
final
(继承的关键好处将丢失)


将方法参数声明为final具有以下含义:

  • 方法无法更改方法参数以指向另一个引用
  • 方法可以修改方法参数,即更改参数所引用对象的状态(修改实例变量)
我将用以下示例来说明这一点。假设我有一个类来表示员工:

class Employee
{
    public String name;
    public Integer id;
}
案例1:

  public void test(final Employee emp)
  {
       emp = new Employee(); //Invalid since you are changing the reference
  }
案例2:

   public void test(final Employee emp)
   {
       emp.name = "John Doe"; //Valid
   }

这与C++中的const参数不同,它也阻止了方法对被传递的对象/引用的状态做任何更改。< / P>好的,我理解。只是我从来没有见过一段代码,其中传递的变量将被声明为方法的最终(即使它们从不改变)。@ USER3178137我不确定C++中的语义是什么,但是我想在java中添加“代码>最终< /COD>引用变量,这意味着你不能重新分配变量。你仍然可以自由地改变变量引用的对象。此外,<代码>最终< /Cord>静态方法意味着你不能隐藏方法,因为ST。atic方法首先不能被重写。@user3178137添加了一个示例和一些附加注释。可能与的重复

   public void test(final Employee emp)
   {
       emp.name = "John Doe"; //Valid
   }