Sonar问题:String literals should not be duplicated

本文针对Sonar报告中指出的重复字符串问题,提出了解决方案。通过将重复的字符串抽取为常量,可以提高代码的可读性和维护性,同时避免了Sonar的非合规警告。在示例代码中,将[action1]抽离为ACTION_1常量,实现了代码优化。

目录

一、sonar问题描述

二、解决方案


一、sonar问题描述

如下代码,多次出现同一个字符串,导致报sonar问题。

public void run() {    
    prepare("action1"); // Noncompliant - "action1" is duplicated 3 times                        
    execute("action1");   
    release("action1");  
}

二、解决方案

抽取为常量

// 抽取为常量
private static final String ACTION_1 = "action1"; // Compliant
public void run() {    
    prepare(ACTION_1 );                      
    execute(ACTION_1 );   
    release(ACTION_1 );  
}

在C++中,`std::string_literals` 是一个命名空间,它提供了一些方便的字符串字面量后缀,用于创建 `std::string`、`std::wstring`、`std::u16string` 和 `std::u32string` 类型的对象。通过使用这些后缀,可以更方便地使用 '+' 操作符进行字符串拼接。 ### 基本原理 在字符串字面量后面加上 `s` 后缀,会自动调用相应的函数,将字符串字面量转换为 `std::string` 或其他宽字符字符串类型的对象。这样就可以使用 '+' 操作符对这些字符串对象进行拼接,因为 `std::string` 类重载了 '+' 操作符以支持字符串拼接。 ### 代码示例 ```cpp #include <iostream> #include <string> // 使用 std::string_literals 命名空间 using namespace std::string_literals; int main() { // 拼接 std::string 类型的字符串 std::string str1 = "Hello"s + " World"s; std::cout << str1 << std::endl; // 拼接 std::wstring 类型的字符串 std::wstring wstr = L"你好"s + L" 世界"s; std::wcout << wstr << std::endl; // 拼接 std::u16string 类型的字符串 std::u16string u16str = u"Bonjour"s + u" le monde"s; // 由于 std::u16string 输出较复杂,这里仅展示拼接逻辑 // 拼接 std::u32string 类型的字符串 std::u32string u32str = U"こんにちは"s + U" 世界"s; // 由于 std::u32string 输出较复杂,这里仅展示拼接逻辑 return 0; } ``` 在上述代码中,使用 `std::string_literals` 命名空间后,在字符串字面量后面加上 `s` 后缀,就可以直接使用 '+' 操作符进行字符串拼接。对于不同的字符编码,如宽字符(`std::wstring`)、UTF-16(`std::u16string`)和UTF-32(`std::u32string`),也可以使用相应的前缀(`L`、`u`、`U`)和 `s` 后缀进行拼接[^1][^3][^4]。 ### 注意事项 - 需要包含 `<string>` 头文件,并使用 `using namespace std::string_literals;` 引入命名空间。 - 只有在字符串字面量后面加上 `s` 后缀才能创建相应的字符串对象,普通的字符串字面量仍然是 `const char*` 类型,不能直接使用 '+' 操作符拼接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值