Java Enum toString有时会将i替换为ı;
我最近收到一份报告说,一些Google Analytics事件类别名称被记录为带有一个I字符,顶部没有一个点 页面浏览量和事件发生两次,一次在i上没有点 我不得不去相信它。果不其然,我举办了一个名为“最爱”的活动,还有一个名为“最爱”的活动。将那个奇怪的字符复制粘贴到终端或单空格字体中,看看它有多奇怪<代码>偏爱ıte 我的第一个怀疑是我的代码,我使用枚举上的Java Enum toString有时会将i替换为ı;,java,android,google-analytics,Java,Android,Google Analytics,我最近收到一份报告说,一些Google Analytics事件类别名称被记录为带有一个I字符,顶部没有一个点 页面浏览量和事件发生两次,一次在i上没有点 我不得不去相信它。果不其然,我举办了一个名为“最爱”的活动,还有一个名为“最爱”的活动。将那个奇怪的字符复制粘贴到终端或单空格字体中,看看它有多奇怪偏爱ıte 我的第一个怀疑是我的代码,我使用枚举上的toString为类别名称生成字符串 public enum AnalyticsEvent { SCREEN_VIEW, FAV
toString
为类别名称生成字符串
public enum AnalyticsEvent {
SCREEN_VIEW,
FAVORITE,
UN_FAVORITE,
CLICK_EVENT,
... reduced for brevity;
public String val() {
return this.toString().toLowerCase();
}
}
如何使用该枚举的示例:
@Override
public void logSearchTag(String type, String value) {
...
logGAEvent(AnalyticsEvent.SEARCH_TAG.val(), type, value);
}
private void logGAEvent(String category, String action, String label) {
... // mGATracker = instance of com.google.android.gms.analytics.Tracker;
mGATracker.send(addCustomDimensions(new HitBuilders.EventBuilder()
.setCategory(category)
.setAction(action)
.setLabel(label))
.build());
...
}
我将通过实际为枚举分配一个字符串来解决这个问题,并在val()
函数中返回该字符串
不过,我很好奇,是否有人知道为什么在少数设备上Enum.toString
返回Enum名称,并用奇怪的字符替换I。我是说小的。5万人中有8人是平均数。或者有没有可能假设是错误的,错误就在分析服务端的某个地方?确实非常怀疑。字符串#toLowerCase方法使用系统的默认区域设置。这将使用特定于区域设置的字符,例如ı
,而不是i
。要解决此问题,请使用区域设置调用toLowerCase
:
String test = "testString";
test.toLowerCase(java.util.Locale.ENGLISH) // Or your preferred locale
String#toLowerCase
方法使用系统的默认区域设置。这将使用特定于区域设置的字符,例如ı
,而不是i
。要解决此问题,请使用区域设置调用toLowerCase
:
String test = "testString";
test.toLowerCase(java.util.Locale.ENGLISH) // Or your preferred locale
谢谢我不小心在另一个时间点关掉了录音室里的线头。当我alt enter尝试修复另一个小写字母,但意外地选择了错误选项关闭检查时。:/有趣的是,我并没有注意到它并没有线头,而是在完全错误的地方寻找问题。谢谢!我不小心在另一个时间点关掉了录音室里的线头。当我alt enter尝试修复另一个小写字母,但意外地选择了错误选项关闭检查时。:/有趣的是,我并没有注意到它并没有使用lint,而是在完全错误的地方查找问题。Android的最佳实践是使用常量而不是枚举。是的,我知道。不要担心代码库中没有枚举。那是他们唯一被使用的地方。不管它是一个枚举还是一个常量,都没有什么区别。不,现在枚举已经在代码中了,必须使用枚举例程来执行它。常量就在字节码里。你在向唱诗班布道。我已经知道了。我并不是说它的表现更好,只是说我愿意在那里接受小小的表现冲击。这不是世界末日。我非常清楚枚举和常量的不同。@danny117没有什么不愉快的感觉,完全同意这个问题需要向下投票(这很糟糕)。这对我来说只是一时的疏忽。但是请阅读这篇文章,它是你思考的食物。帮你打开思路。Android的最佳实践是使用常量而不是枚举。是的,我知道。不要担心代码库中没有枚举。那是他们唯一被使用的地方。不管它是一个枚举还是一个常量,都没有什么区别。不,现在枚举已经在代码中了,必须使用枚举例程来执行它。常量就在字节码里。你在向唱诗班布道。我已经知道了。我并不是说它的表现更好,只是说我愿意在那里接受小小的表现冲击。这不是世界末日。我非常清楚枚举和常量的不同。@danny117没有什么不愉快的感觉,完全同意这个问题需要向下投票(这很糟糕)。这对我来说只是一时的疏忽。但是请阅读这篇文章,它是你思考的食物。帮你打开一点心扉。