我有一个Java程序,它会抛出很多实数。
我有两种模式,我希望能够编译它。
我是否可以通过某种方式在全球范围内将所有double
float
用Float
换成一个标志?目前,我正在使用"查找和替换",这不是最好的做事方式。
编辑:由于有些人建议使用模板/泛型,我还会增加一个要求:效率。根据我的理解,big-F float
是对值的引用,而small-f,原始import UIKit
import Parse
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
//--------------------------------------
// MARK: - UIApplicationDelegate
//--------------------------------------
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Parse.setApplicationId("APIKEYHERE", clientKey: "CLIENTKEYHERE")
let types:UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]
let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
//--------------------------------------
// MARK: Push Notifications
//--------------------------------------
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let installation = PFInstallation.currentInstallation()
installation.setDeviceTokenFromData(deviceToken)
installation.saveInBackground()
PFPush.subscribeToChannelInBackground("") { (succeeded: Bool, error: NSError?) in
if succeeded {
print("ParseStarterProject successfully subscribed to push notifications on the broadcast channel.\n");
} else {
print("ParseStarterProject failed to subscribe to push notifications on the broadcast channel with error = %@.\n", error)
}
}
}
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
if error.code == 3010 {
print("Push notifications are not supported in the iOS Simulator.\n")
} else {
print("application:didFailToRegisterForRemoteNotificationsWithError: %@\n", error)
}
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
PFPush.handlePush(userInfo)
if application.applicationState == UIApplicationState.Inactive {
PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
}
}
}
只是值,因此使用基元更有时间和内存效率,特别是在处理它们的大数组时(我是)。模板/泛型不能与基元一起使用。所以我想找到一个不需要牺牲效率的解决方案(因为这会破坏整个问题的最初目的)。除非我弄错了,并且有一些方法可以用模板和灵长来做这件事。
结论如此远(2015年12月28日21:00):没有令人满意的方式,只需使用双倍。
答案 0 :(得分:3)
您要找的是strategy。
创建一个接口(或可能是抽象类),它是实数的模型:
public interface RealNumber {
// Define needed methods here!
}
然后为该接口创建至少两个实现:
public final class AccurateRealNumber implements RealNumber {
private final double number;
public AccurateRealNumber(double number) { this.number = number; }
// Implement interface methods here!
}
public final class LazyRealNumber implements RealNumber {
private final float number;
public LazyRealNumber(float number) { this.number = number; }
// Implement interface methods here!
}
然后,您只能使用RealNumber
类型的变量,其实例可以是LazyRealNumber
或AccurateRealNumber
- 您的选择。
您必须在接口中声明需要使用的方法,以便可以在该接口类型的变量上调用它们。这些方法应包含用于解决域逻辑的域逻辑。他们应该不返回值(尽管他们可以),因为这些值的类型不同。
答案 1 :(得分:2)
使用浮点数比使用浮点数获得的速度或内存效率要高得多(单词大小现在是64位,双倍也是64位)。
答案 2 :(得分:1)
这可能是过度工程,但你如何使用依赖注入对象?
例如,您可以定义两个单独的对象,这些对象基本上只包括浮点数和双精度数。我想到的结构:
public class FastNumber implements MyNumber<Float>{
private Float number;
...
}
public class AccurateNumber implements MyNumber<Double>{
private Double number;
...
}
public interface MyNumber<T>{
//Methods to access and mutate number
addToNumber(T num);
subtractFromNumber(T num);
}
由于他们可以实现相同的接口,因此您可以将代码更改为仅使用该接口,然后您可以根据简单的配置根据需要依赖注入FastNumber
或AccurateNumber
。例如,使用spring boot或仅使用spring。再次,这可能是过度工程化的。
答案 3 :(得分:0)
我认为一个好的方法是创建一个类的模板,其中包含您想要动态更改的类型的变量。然后,您可以根据您想要使用的模式传入您喜欢的任何类型。
答案 4 :(得分:0)
可能就像这个
一样简单constant:
integer-constant
floating-constant
enumeration-constant
character-constant
}
为简单起见,类成员都是公共的,数组的大小是固定的,但我希望你能理解。